포스코DX X 비트교육센터 6기 - IoC Container / JUnit
container 실습 (XML Config)
XML Auto Configuration(Annotation Scanning)
xml annotation-config 기반의 container를 이용해보기!!!!!!!
- 파일 구조
[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;
}
}
- 실행 결과
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());
}
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을 구분하지 않고 사용한다.
- type으로 가져오면, 캐스팅을 안해도 돼서 좋다.
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); 이렇게 써주어야한다.
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를 붙여준다.
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);
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);
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("마이콜");
}
}
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;
}
}