포스코DX X 비트교육센터 6기 - container


두 개의 Bean이 있을 때,

Qualifier("[name]") 으로 이름을 지정해주기

container - Explicit (Java Configuration) 실습

  • DVDPlayerConfig.java
package com.poscodx.container.config.videosystem;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.poscodx.container.videosystem.Avengers;
import com.poscodx.container.videosystem.DVDPlayer;
import com.poscodx.container.videosystem.DigitalVideoDisc;

@Configuration
public class DVDPlayerConfig {
	@Bean
	public DigitalVideoDisc avengers() {
		return new Avengers();
	}
	
	// 주입(Injection)하기 I
	// Bean 생성메소드를 직접 호출하는 방법
	// 생성자 주입
	@Bean("dvdPlayer")
	public DVDPlayer dvdPlayer01() {
		return new DVDPlayer(avengers());
	}
	
	// 주입(Injection)하기 II
	// Parameter로 Bean을 전달하는 방법
	// 생성자 주입
	@Bean
	public DVDPlayer dvdPlayer02(DigitalVideoDisc dvd) {
		return new DVDPlayer(dvd);
	}

	// 주입(Injection)하기 III
	// Parameter로 Bean을 전달하는 방법
	// setter 주입
	@Bean
	public DVDPlayer dvdPlayer03(DigitalVideoDisc dvd) {
		DVDPlayer dvdPlayer = new DVDPlayer();
		dvdPlayer.setDvd(dvd);
		
		return dvdPlayer;
	}
	
}
  • DVDPlayerJavaConfigTest.java
package com.poscodx.container.videosystem;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;

import com.poscodx.container.config.videosystem.DVDPlayerConfig;

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes={DVDPlayerConfig.class})
public class DVDPlayerJavaConfigTest {
	@Autowired
	// 같은 타입의 빈이 2개 이상 있는 경우
	// 설정 클래스의 빈생성 메소드의 @Bean의 name(default) 속성으로  Qulify 하기
	@Qualifier("dvdPlayer")
	DVDPlayer dvdPlayer01;
	
	@Autowired
	// 같은 타입의 빈이 2개 이상 있는 경우
	// 설정 클래스의 빈생성 메소드의 이름으로 Qulify 하기
	@Qualifier("dvdPlayer02")
	DVDPlayer dvdPlayer02;

	@Autowired
	@Qualifier("dvdPlayer03")
	DVDPlayer dvdPlayer03;
	
	@Test
	public void testDvdPlayer01NotNull() {
		assertNotNull(dvdPlayer01);
	}

	@Test
	public void testDvdPlayer02NotNull() {
		assertNotNull(dvdPlayer02);
	}

	@Test
	public void testDvdPlayer03NotNull() {
		assertNotNull(dvdPlayer03);
	}

	@Test
	public void testPlay() {
		assertEquals("Playing Movie MARVEL's Avengers", dvdPlayer03.play());
	}
}

container - Explicit - (Xml config) 실습

  • applicationConfig.java
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
        http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">

	<!-- 01.  설정: 초간단 -->
	<bean class="com.poscodx.container.videosystem.Avengers" />

	<!-- 02. 빈 설정: id 부여하기 -->
	<bean id="ironMan" class="com.poscodx.container.videosystem.IronMan" />

	<!-- 03. 빈 설정: 생성자 리터럴 사용1 -->
	<bean id="avengersInfiniteWar" class="com.poscodx.container.videosystem.BlankDisc">
		<constructor-arg name="studio" value="MARVEL"/>
		<constructor-arg name="title" value="Avenger Infinite War"/>
	</bean>

	<!-- 04. 빈 설정: 생성자 리터럴 사용2 -->
	<bean
		id="avengersEndgame"
		class="com.poscodx.container.videosystem.BlankDisc"
		c:title="Avenger Endgame"
		c:studio="MARVEL" />

	<!-- 05. 빈 설정: 생성자 리터럴 사용3 -->
	<bean
		id="avengersAgeOfUltron"
		class="com.poscodx.container.videosystem.BlankDisc"
		c:_1="MARVEL"
		c:_0="Avenger Age of Ultron" />

	<!-- 06. 빈 설정: 생성자 null argument -->
	<bean id="avengersCaptainAmerica" class="com.poscodx.container.videosystem.BlankDisc">
		<constructor-arg name="studio" value="MARVEL"/>
		<constructor-arg name="title" value="Avengers Captain America"/>
		<constructor-arg><null/></constructor-arg>
	</bean>
	
	<!-- 07. 빈 설정: 생성자 Collection Argument -->
	<bean id="avengersDirectorEdition" class="com.poscodx.container.videosystem.BlankDisc">
		<constructor-arg name="studio" value="MARVEL"/>
		<constructor-arg name="title" value="Avengers Director Edition"/>
		<constructor-arg name="actors">
			<list>
				<value>Robert Downey Jr.</value>
				<value>Christ Evans</value>
			</list>
		</constructor-arg>
	</bean>

	<!-- 08. 빈 설정: 생성자 Wiring Collection -->
	<bean
		id="avengersTriplePack"
		class="com.poscodx.container.videosystem.DVDPack"
		c:title="Avengers Triple Pack">
		<constructor-arg name="dvds">
			<list>
				<ref bean="avengersInfiniteWar"/>
				<ref bean="avengersEndgame"/>
				<ref bean="avengersAgeOfUltron"/>
			</list>
		</constructor-arg>
	</bean>

	<!-- 09. 빈 설정: 프로퍼티 사용1 -->
	<bean id="avengersExpansionEdition1" class="com.poscodx.container.videosystem.BlankDisc">
		<property name="studio" value="MARVEL"/>
		<property name="title" value="Avengers Expansion Edition1"/>
	</bean>

	<!-- 10. 빈 설정: 프로퍼티 사용2 -->
	<bean
		id="avengersExpansionEdition2"
		class="com.poscodx.container.videosystem.BlankDisc"
		p:title="Avengers Expansion Edition2"
		p:studio="MARVEL">
		<property name="actors">
			<list>
				<value>Robert Downey Jr.</value>
				<value>Christ Evans</value>
			</list>
		</property>		
	</bean>	

	<!-- 11. 빈 설정: 프로퍼티 사용3 -->
	<util:list id="actorList">
		<value>Robert Downey Jr.</value>
		<value>Christ Evans</value>
	</util:list>
	<bean
		id="avengersExpansionEdition3"
		class="com.poscodx.container.videosystem.BlankDisc"
		p:title="Avengers Expansion Edition3"
		p:studio="MARVEL"
		p:actors-ref="actorList">		
	</bean>	

	<!-- 12. 빈 주입: 생성자 주입1 -->
	<bean id="dvdPlayer1" class="com.poscodx.container.videosystem.DVDPlayer">
		<constructor-arg ref="ironMan" />
	</bean>

	<!-- 13. 빈 주입: 생성자 주입2: c-namespace의 argument name을 사용하는 방법 -->
	<bean
		id="dvdPlayer2"
		class="com.poscodx.container.videosystem.DVDPlayer"
		c:dvd-ref="ironMan"/>
		
	<!-- 14. 빈 주입: 생성자 주입3: c-namespace의 argument name을 사용하는 방법 -->
	<bean
		id="dvdPlayer3"
		class="com.poscodx.container.videosystem.DVDPlayer"
		c:_0-ref="ironMan"/>
	
	<!-- 15. 빈 주입: setter 주입1 -->
	<bean id="dvdPlayer4" class="com.poscodx.container.videosystem.DVDPlayer">
		<property name="dvd" ref="ironMan" />
	</bean>
	
	<!-- 16. 빈 주입: 프로퍼티 주입2: p-namespace -->
	<bean id="dvdPlayer5" class="com.poscodx.container.videosystem.DVDPlayer"
	p:dvd-ref="ironMan">
		<property name="dvd" ref="ironMan" />
	</bean>
	
</beans>
  • DVDPlayerXmlConfigTest.java
package com.poscodx.container.videosystem;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;

import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;

@ExtendWith(SpringExtension.class)
@ContextConfiguration(locations={"classpath:com/poscodx/container/config/videosystem/applicationContext.xml"})
public class DVDPlayerXmlConfigTest {
	// @Autowired
	// 예외
	// XML Bean Configuration(Avengers)에서는 자동으로 id를 부여 하지 않는다.
	// @Qualifier를 사용할 수 없다.
	DigitalVideoDisc dvd1;

	@Autowired
	@Qualifier("ironMan")
	DigitalVideoDisc dvd2;

	@Autowired
	@Qualifier("avengersInfiniteWar")
	DigitalVideoDisc dvd3;

	@Autowired
	@Qualifier("avengersEndgame")
	DigitalVideoDisc dvd4;

	@Autowired
	@Qualifier("avengersAgeOfUltron")
	DigitalVideoDisc dvd5;

	@Autowired
	@Qualifier("avengersCaptainAmerica")
	DigitalVideoDisc dvd6;

	@Autowired
	@Qualifier("avengersDirectorEdition")
	DigitalVideoDisc dvd7;

	@Autowired
	@Qualifier("avengersExpansionEdition1")
	DigitalVideoDisc dvd8;

	@Autowired
	@Qualifier("avengersExpansionEdition2")
	DigitalVideoDisc dvd9;

	@Autowired
	@Qualifier("avengersExpansionEdition3")
	DigitalVideoDisc dvd10;
		
	@Autowired
	DVDPack dvdPack;
	
	@Autowired
	@Qualifier("dvdPlayer1")
	DVDPlayer dvdPlayer1;

	@Autowired
	@Qualifier("dvdPlayer2")
	DVDPlayer dvdPlayer2;
	
	@Autowired
	@Qualifier("dvdPlayer3")
	DVDPlayer dvdPlayer3;
	
	@Autowired
	@Qualifier("dvdPlayer4")
	DVDPlayer dvdPlayer4;
	
	@Autowired
	@Qualifier("dvdPlayer5")
	DVDPlayer dvdPlayer5;

	@Test
	public void testPlay1() {
		assertEquals("Playing Movie MARVEL's Iron Man", dvdPlayer1.play());
	}

	@Test
	public void testPlay2() {
		assertEquals("Playing Movie MARVEL's Iron Man", dvdPlayer2.play());
	}
	
	@Test
	public void testPlay3() {
		assertEquals("Playing Movie MARVEL's Iron Man", dvdPlayer3.play());
	}
	
	@Test
	public void testPlay4() {
		assertEquals("Playing Movie MARVEL's Iron Man", dvdPlayer4.play());
	}
	
	@Test
	public void testPlay5() {
		assertEquals("Playing Movie MARVEL's Iron Man", dvdPlayer5.play());
	}
	
	
	
	///////////////////////////////////////////////
	
	@Disabled
	@Test
	public void testDVD1() {
		assertNotNull(dvd1);
	}
	
	@Test
	public void testDVD2() {
		assertNotNull(dvd2);
	}

	@Test
	public void testDVD3() {
		assertNotNull(dvd3);
	}

	@Test
	public void testDVD4() {
		assertNotNull(dvd4);
	}

	@Test
	public void testDVD5() {
		assertNotNull(dvd5);
	}

	@Test
	public void testDVD6() {
		assertNotNull(dvd6);
	}

	@Test
	public void testDVD7() {
		assertNotNull(dvd7);
	}

	@Test
	public void testDVD8() {
		assertNotNull(dvd8);
	}

	@Test
	public void testDVD9() {
		assertNotNull(dvd9);
	}

	@Test
	public void testDVD10() {
		assertNotNull(dvd10);
	}

	@Test
	public void testDVDPack() {
		assertNotNull(dvdPack);
	}
}

mysite04

https://github.com/talkingOrange/mysite/commits/master/mysite04