포스코DX X 비트교육센터 6기 - IoC Container / JUnit


container 실습 (XML Config)

XML Auto Configuration(Annotation Scanning)

xml annotation-config 기반의 container를 이용해보기!!!!!!!

image

  • 파일 구조


[src/main/java]
	com.poscodx.container.user
		|-- User.java
		|-- Friend.java
		
	com.poscodx.container.user.test
		|-- XmlConfigTest.java

	com.poscodx.container.soundsystem
	com.poscodx.container.videosystem


[src/main/resources]
	com.poscodx.container.user
		|-- applicationContext01.xml (Auto)
		|-- applicationContext02.xml (Explicit)

[src/test/java]
[src/test/resources]
  • XmlConfigTest.java
package com.poscodx.container.user.test;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

public class XmlConfigTest {
	public static void main(String[] args) {
		//XML Auto Configuration(Annotation Scanning)
		testBeanFactory01();
		
	}

	private static void testBeanFactory01() {
		BeanFactory bf = new XmlBeanFactory(new ClassPathResource("com/poscodx/container/user/applicationContext.xml"));
	//	User user = bf.getBean(User.class);
		//System.out.println(user.getName());
		
	}
}
  • applicationContext.xml
<?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: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">

<!-- 이게 포인트 --!>
   <context:annotation-config />
   
   
   <context:component-scan base-package="com.poscodx.container.user">
      <context:include-filter type="annotation" expression="org.springframework.stereotype.Component" />
   </context:component-scan>


</beans>
  • 실행 결과 : 잘 돌아감. 아무것도 안뜸. 에러도 안남.

  • XmlConfigTest.java

package com.poscodx.container.user.test;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

import com.poscodx.container.user.User;

public class XmlConfigTest {
	public static void main(String[] args) {
		//XML Auto Configuration(Annotation Scanning)
		testBeanFactory01();
		
	}

	private static void testBeanFactory01() {
		BeanFactory bf = new XmlBeanFactory(new ClassPathResource("com/poscodx/container/user/applicationContext.xml"));
		User user = bf.getBean(User.class);
		System.out.println(user.getName());
		
	}
}

  • User.java
package com.poscodx.container.user;

import org.springframework.stereotype.Component;

@Component
public class User {
	private String name = "둘리";
	
	public String getName() {
		return name;
	}
}

  • 실행 결과

image

container 실습 02

XML Bean Configuration(Explicit Configuration)

명시적으로 Bean을 설정 (오타의 위험이 발생)

  • XmlConfigTest.java
package com.poscodx.container.user.test;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

import com.poscodx.container.user.User;

public class XmlConfigTest {
	public static void main(String[] args) {
		//XML Auto Configuration(Annotation Scanning)
		testBeanFactory01();
		
		//XML Bean Configuration(Explicit Configuration)
		testBeanFactory02();
		
	}

	private static void testBeanFactory02() {
		BeanFactory bf = new XmlBeanFactory(new ClassPathResource("com/poscodx/container/user/applicationContext02.xml"));
		User user = bf.getBean(User.class);
		System.out.println(user.getName());
		
	}

	private static void testBeanFactory01() {
		BeanFactory bf = new XmlBeanFactory(new ClassPathResource("com/poscodx/container/user/applicationContext.xml"));
		User user = bf.getBean(User.class);
		System.out.println(user.getName());
		
	}
}

  • applicationContext02.xml
<?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: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">


  <bean class="com.poscodx.container.user.User" />
  


</beans>

container 실습03

Auto Configuration의 이용

  • XmlConfigTest.java
package com.poscodx.container.user.test;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

import com.poscodx.container.user.User;

public class XmlConfigTest {
	public static void main(String[] args) {
		//XML Auto Configuration(Annotation Scanning)
		//testBeanFactory01();
		
		//XML Bean Configuration(Explicit Configuration)
		//testBeanFactory02();
		
		//XML Auto Configuration(Annotation Scanning)
		testApplicationContext01();
	}

	private static void testApplicationContext01() {
		ApplicationContext ac  = new ClassPathXmlApplicationContext("com/poscodx/container/user/applicationContext.xml");
		
		User user = ac.getBean(User.class);
		System.out.println(user.getName());
	
		// Annotation Scan(Auto Configuration) 에서는 Bean id가 자동으로 부여된다.
		user = (User)ac.getBean("user");
		System.out.println(user.getName());
	}

image

container 실습04

Bean Configuration의 이용

  • XmlConfigTest.java
package com.poscodx.container.user.test;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

import com.poscodx.container.user.User;

public class XmlConfigTest {
	public static void main(String[] args) {
		//XML Auto Configuration(Annotation Scanning)
		//testBeanFactory01();
		
		//XML Bean Configuration(Explicit Configuration)
		//testBeanFactory02();
		
		//XML Auto Configuration(Annotation Scanning)
		//testApplicationContext01();

		//XML Bean Configuration(Explicit Configuration)
		testApplicationContext02();
	}

	private static void testApplicationContext02() {
		ApplicationContext ac  = new ClassPathXmlApplicationContext("com/poscodx/container/user/applicationContext02.xml");
		
		User user = null;
		
		//Type으로 빈 가져오기
		user = ac.getBean(User.class);
		System.out.println(user.getName());
		
		// id로 빈 가져오기
		//user = (User)ac.getBean("user");
		//System.out.println(user.getName());
		
	}
  • 명시적일 때는, id로 빈 가져오는 것이 자동으로 안되기 때문에 오류가 발생한다. 따라서 id로 빈 가져오는 문장을 오류없이 실행시키려면,,,

applicationContext02.xml에


  <bean id="user" class="com.poscodx.container.user.User" />
  

id 값을 명시적으로 추가해주면 된다.

그리고, bean에 name값을 추가해도 된다. 이 아이는 id와 name을 구분하지 않고 사용한다.

image

  • type으로 가져오면, 캐스팅을 안해도 돼서 좋다.

image

XmlConfigTest.java 최종 코드

package com.poscodx.container.user.test;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

import com.poscodx.container.user.User;

public class XmlConfigTest {
	public static void main(String[] args) {
		//XML Auto Configuration(Annotation Scanning)
		//testBeanFactory01();
		
		//XML Bean Configuration(Explicit Configuration)
		//testBeanFactory02();
		
		//XML Auto Configuration(Annotation Scanning)
		//testApplicationContext01();

		//XML Bean Configuration(Explicit Configuration)
		testApplicationContext02();
	}

	private static void testApplicationContext02() {
		ApplicationContext ac  = new ClassPathXmlApplicationContext("com/poscodx/container/user/applicationContext02.xml");
		
		User user = null;
		
		//Type으로 빈 가져오기
		user = ac.getBean(User.class);
		System.out.println(user.getName());
		
		// id로 빈 가져오기
		user = (User)ac.getBean("user");
		System.out.println(user.getName());
		
		// name로 빈 가져오기
		user = (User)ac.getBean("usr");
		System.out.println(user.getName());
		
	}

	private static void testApplicationContext01() {
		ApplicationContext ac  = new ClassPathXmlApplicationContext("com/poscodx/container/user/applicationContext.xml");
		
		User user = ac.getBean(User.class);
		System.out.println(user.getName());
	
		// Annotation Scan(Auto Configuration) 에서는 Bean id가 자동으로 부여된다.
		user = (User)ac.getBean("user");
		System.out.println(user.getName());
	}

	private static void testBeanFactory02() {
		BeanFactory bf = new XmlBeanFactory(new ClassPathResource("com/poscodx/container/user/applicationContext02.xml"));
		User user = bf.getBean(User.class);
		System.out.println(user.getName());
		
	}

	private static void testBeanFactory01() {
		BeanFactory bf = new XmlBeanFactory(new ClassPathResource("com/poscodx/container/user/applicationContext.xml"));
		User user = bf.getBean(User.class);
		System.out.println(user.getName());
		
	}
}

container 실습05

명시적 bean을 2개 만든 경우

  • applicationContext02.xml
<?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: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">

<!-- 기본 생성자로  생성하기 -->
  <bean id="user" name="usr" class="com.poscodx.container.user.User" />
  
<!-- 파라미터 1개인 생성자로 빈 생성하기 -->
  <bean id="user2" class="com.poscodx.container.user.User" >
  	<constructor-arg value="마이콜"/>
  </bean>
  

</beans>
  • XmlConfigTest.java
	private static void testApplicationContext02() {
		ApplicationContext ac  = new ClassPathXmlApplicationContext("com/poscodx/container/user/applicationContext02.xml");
		
		User user = null;
		
		//Type으로 빈 가져오기
		//같은 타입의 빈이 2개 이상 있으면 Type으로 가져오기는 실패
		user = ac.getBean("user2", User.class);
		System.out.println(user.getName());
		
		// id로 빈 가져오기
		user = (User)ac.getBean("user");
		System.out.println(user.getName());
		
		// name로 빈 가져오기
		user = (User)ac.getBean("usr");
		System.out.println(user.getName());
		
	}
  • type으로 가져오기를 주목한다. 같은 타입의 빈이 2개 이상 있을 때, user = ac.getBean(User.class); 이렇게 실행하면 에러 발생

  • user = ac.getBean(“user2”, User.class); 이렇게 써주어야한다.

image

container 실습06

파라미터 2개인 생성자로 빈 생성하기

  • applicationContext02.xml
//Type으로 빈 가져오기
		//같은 타입의 빈이 2개 이상 있으면 Type으로 가져오기는 실패
		user = ac.getBean("user2", User.class);
		System.out.println(user.getName());
		
		//Type으로 빈 가져오기
		user = ac.getBean("user3", User.class);
		System.out.println(user.getName());
  • User.java
package com.poscodx.container.user;

import org.springframework.stereotype.Component;

@Component
public class User {
	private String name = "둘리";
	private Long no = 0L;
	
	public User() {
	}
	
	public User(String name) {
		this.name = name;
	}
	
	public User(String name, Long no) {
		this.name = name;
		this.no = no;
	}
	
	public String getName() {
		return name;
	}
	
	public Long getNo() {
		return no;
	}

	@Override
	public String toString() {
		return "User [name=" + name + ", no=" + no + "]";
	}
	
	
}

  • XmlConfigTest.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: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">

<!-- 기본 생성자로  생성하기 -->
  <bean id="user" name="usr" class="com.poscodx.container.user.User" />
  
<!-- 파라미터 1개인 생성자로 빈 생성하기 -->
  <bean id="user2" class="com.poscodx.container.user.User" >
  	<constructor-arg value="마이콜"/>
  </bean>
  
  <!-- 파라미터 2개인 생성자로 빈 생성하기 -->
  <bean id="user3" class="com.poscodx.container.user.User" >
  	<constructor-arg value="마이콜"/>
  	<constructor-arg value="3"/>
  </bean>
  

  <!-- 파라미터 2개인 생성자로 빈 생성하기 -->
  <bean id="user3" class="com.poscodx.container.user.User" >
  	<constructor-arg index = "0" value="마이콜"/>
  	<constructor-arg index = "1" value="3"/>
  </bean>
  
  
</beans>
  • xml 상에서 순서가 바뀔 수도 있으니까 index를 붙여준다.

image

container 실습07

setter 사용한 Bean 가져오기

  • applicationContext02.xml
<!-- setter 사용하기 -->
	<bean id="user5" class="com.poscodx.container.user.User">
		<property name="no" value="5"/>
		<property name="name" value="길동"/>
	</bean>

  • User.java
package com.poscodx.container.user;

import java.util.List;

import org.springframework.stereotype.Component;

@Component
public class User {
	private Long no = 0L;
	private String name = "둘리";
	
	public User() {
	}
	
	public User(String name) {
		this.name = name;
	}
	
	public User(Long no, String name) {
		this.no = no;
		this.name = name;
	}
	
	public void setNo(Long no) {
		this.no = no;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}

	
	@Override
	public String toString() {
		return "User [no=" + no + ", name=" + name ]";
	}
}
  • XmlConfigTest.java
// setter를 사용한 빈I 가져오기
		user = ac.getBean("user5", User.class);
		System.out.println(user);

container 실습08

DI 사용한 Bean 가져오기

  • applicationContext02.xml
<bean id="friend" class="com.poscodx.container.user.Friend">
   <constructor-arg value="영희"/>
</bean>
<bean id="user6" class="com.poscodx.container.user.User">
   <property name="no" value="6"/>
   <property name="name" value="철수"/>
   <property name="friend" ref="friend"/>
</bean>
  • Friend.java
package com.poscodx.container.user;

public class Friend {
	private String name;

	public Friend(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Friend [name=" + name + "]";
	}

}

  • User.java (추가)

private Friend friend = null;

public void setFriend(Friend friend){

   this.friend = friend;

}

public String toString(){
	return no + name + friend;
}

  • XmlConfigTest.java
user = ac.getBean("user6", User.class);
sysout(user);

image

container 실습09

DI 사용한 Bean 가져오기

  • User.java (추가)
private List<String> friends;

public void setFriends(List<String> friends){
 this.friends = friends;
}

public String toString(){
	return no + name + friend + friends;
}

  • applicationContext02.xml
<bean id="friend" class="com.poscodx.container.user.Friend">
   <constructor-arg value="영희"/>
</bean>
<!-- setter를 사용한 List(Collection) 세팅하기 -->
<bean id="user7" class="com.poscodx.container.user.User">
   <property name="no" value="7"/>
   <property name="name" value="아이언맨"/>
   <property name="friends">
	<list>
		<value>헐크</value>
		<value>캡틴아메리카</value>
		<value>스파이더맨</value>
	</list>
   </property>
</bean>
  • XmlConfigTest.java
user = ac.getBean("user7", User.class);
sysout(user);

image


JavaConfig 실습

  • 파일 구조

[src/main/java]
1	com.poscodx.container.config.user
		|-- AppConfig.java

	com.poscodx.container.user
		|-- User.java
		|-- Friend.java
		
	com.poscodx.container.user.test
		|-- XmlConfigTest.java
		|-- JavaConfigTest.java
		
	com.poscodx.container.soundsystem
	com.poscodx.container.videosystem


[src/main/resources]
	com.poscodx.container.user
		|-- applicationContext01.xml (Auto)
		|-- applicationContext02.xml (Explicit)

[src/test/java]
[src/test/resources]
  • JavaConfigTest.java
package com.poscodx.container.user.test;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class JavaConfigTest {
	public static void main(String[] args) {
		testJavaConfigTest();
	}

	private static void testJavaConfigTest() {
		new AnnotationConfigApplicationContext(AppConfig.class);
	}
}


  • AppConfig.java
package com.poscodx.container.config.user;

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

@Configuration
@ComponentScan(basePackages= {"com.poscodx.container.user"})
public class AppConfig {

}

여기에 있는 게, xml Config의 applicationContext.xml에 있는 context:component-scan의 모양과 비슷하다고 보면 된다.

최종코드

  • JavaConfigTest.java
package com.poscodx.container.user.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.poscodx.container.config.user.AppConfig;
import com.poscodx.container.user.Friend;
import com.poscodx.container.user.User;

public class JavaConfigTest {
	public static void main(String[] args) {
		testJavaConfigTest();
	}

	private static void testJavaConfigTest() {
		ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
		User user =  ac.getBean(User.class);
		System.out.println(user);
		
		Friend friend = ac.getBean(Friend.class);
		System.out.println(friend);
	}
}

  • AppConfig.java
package com.poscodx.container.config.user;

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

import com.poscodx.container.user.Friend;

@Configuration
@ComponentScan(basePackages= {"com.poscodx.container.user"})
public class AppConfig {
	
	@Bean
	public Friend friend() {
		return new Friend("마이콜");
	}
	
}

image


CDPlayer

  • 파일구조

[src/main/java]

	com.poscodx.container.config.user

		|-- AppConfig.java

	com.poscodx.container.user

		|-- User.java

		|-- Friend.java

	com.poscodx.container.user.test

		|-- XmlConfigTest.java
		|-- JavaConfigTest.java

	com.poscodx.container.config.soundsystem
		|-- CDPlayerConfig.java		
	com.poscodx.container.soundsystem
		|-- CDPlayer.java
		|-- CompactDisc.java
		|-- HighSchoolRapper.java

[src/main/resources]
	com.poscodx.container.config.soundsystem
		|-- applicationContext.xml

	com.poscodx.container.config.user
		|-- applicationContext01.xml (Auto)
		|-- applicationContext02.xml (Explicit)

[src/test/java]
	com.poscodx.container.soundsystem
		|-- CDPlayerXmlConfigTest.java
		|-- CDPlayerJavaConfigTest.java

[src/test/resources]
  • pom.xml
<!-- junit(jupiter) -->
		<dependency>
			<groupId>org.junit.jupiter</groupId>
			<artifactId>junit-jupiter-api</artifactId>
			<version>5.9.1</version>
			<scope>test</scope>
		</dependency>

scope은 test 패키지는 빌드할 때, 안 들어가는데, test complie할 때만 쓰라는 의미로 들어가 있는 것이다.

  • pom.xml
<!-- spring test -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org-springframework-version}</version>
		</dependency>

@test를 사용할 수 있게 해주는 dependency

  • container/src/main/java/com/poscodx/container/config/user/AppConfig.java
package com.poscodx.container.config.user;

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

import com.poscodx.container.user.Friend;

@Configuration
@ComponentScan(basePackages={"com.poscodx.container.user"})
public class AppConfig {

	@Bean
	public Friend friend() {
		return new Friend("마이콜"); 
	}
}
  • container/src/main/java/com/poscodx/container/soundsystem/CDPlayer.java
package com.poscodx.container.soundsystem;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class CDPlayer {

	@Autowired
	private CompactDisc cd;
	
	public String play() {
		return cd.play();
	}

}

  • container/src/main/java/com/poscodx/container/soundsystem/CompactDisc.java
package com.poscodx.container.soundsystem;

public interface CompactDisc {

	String play();

}

  • container/src/main/java/com/poscodx/container/soundsystem/HighSchoolRapper2.java
package com.poscodx.container.soundsystem;

import org.springframework.stereotype.Component;

@Component
public class HighSchoolRapper2 implements CompactDisc {
	
	private String title = "붕붕";
	private String artist = "김하온";
	
	
	@Override
	public String play() {
		return "Playing "+ title + " by " + artist;
	}

}

  • container/src/main/resources/com/poscodx/container/config/soundsystem/applicationContext.xml

<?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: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">

	<context:annotation-config />

	<context:component-scan base-package="com.poscodx.container.soundsystem">
		<context:include-filter type="annotation" expression="org.springframework.stereotype.Component" />			
	</context:component-scan>
</beans>
  • container/src/test/java/com/poscodx/container/soundsystem/CDPlayerXmlConfigTest.java
package com.poscodx.container.soundsystem;

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.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;

@ExtendWith(SpringExtension.class)
@ContextConfiguration("classpath:com/poscodx/container/config/soundsystem/applicationContext.xml")
public class CDPlayerXmlConfigTest {
	@Autowired
	CDPlayer cdPlayer;

	@Test
	public void testCDPlayerNotNull() {
		assertNotNull(cdPlayer);
	}

	@Test
	public void testPlay() {
		String stream = cdPlayer.play();
		assertEquals("Playing 붕붕 by 김하온", stream);
	}

}

java config

  • CDPlayerConfig.java
package com.poscodx.container.config.soundsystem;

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

@Configuration
@ComponentScan(basePackages= {"com.poscodx.container.soundsystem"})
public class CDPlayerConfig {

	
}


  • CDPlayerJavaConfigTest.java
package com.poscodx.container.config.soundsystem;

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

@Configuration
@ComponentScan(basePackages= {"com.poscodx.container.soundsystem"})
public class CDPlayerConfig {
}


videosystem

  • 파일 구조
[src/main/java]

	com.poscodx.container.config.user

		|-- AppConfig.java

	com.poscodx.container.user

		|-- User.java

		|-- Friend.java

	com.poscodx.container.user.test

		|-- XmlConfigTest.java
		|-- JavaConfigTest.java

	com.poscodx.container.config.soundsystem
		|-- CDPlayerConfig.java		
	com.poscodx.container.soundsystem
		|-- CDPlayer.java
		|-- CompactDisc.java
		|-- HighSchoolRapper.java

	com.poscodx.container.config.videosystem
		|-- DVDPlayerConfig.java	
	com.poscodx.container.videosystem
		|-- DVDPlayer.java
		|-- DigitalVideoDisc.java
		|-- Avengers.java

[src/main/resources]
	com.poscodx.container.config.videosystem
		|-- applicationContext.xml

	com.poscodx.container.config.soundsystem
		|-- applicationContext.xml

	com.poscodx.container.config.user
		|-- applicationContext01.xml (Auto)
		|-- applicationContext02.xml (Explicit)

[src/test/java]
	com.poscodx.container.soundsystem
		|-- CDPlayerXmlConfigTest.java
		|-- CDPlayerJavaConfigTest.java

[src/test/resources]
  • DVDPlayer.java
package com.poscodx.container.videosystem;

public class DVDPlayer {

	private DigitalVideoDisc dvd;
	
	public String play() {
		return dvd.play();
	}
}

  • DisitalVideoDisc.java (interface)
package com.poscodx.container.videosystem;

public interface DigitalVideoDisc {
	String play();
}

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

import org.springframework.context.annotation.Configuration;

@Configuration
public class DVDPlayerConfig {

}

  • Avengers.java
package com.poscodx.container.videosystem;

public class Avengers implements DigitalVideoDisc{
	private String title="Avengers";
	private String studio = "MARVEL";
	
	@Override
	public String play() {
		return "playing Movie "+ studio+"'s " + title;
	}
}