Spring framework에서 중요한 핵심 개념인 DI(Dependence injection)에 대한 이해를 돕고자,
Xml설정 파일을 이용해서 Spring Container(ClassPathXmlApplicationContext.class)에
Bean객체를 등록하는 예제입니다.
User.java
@Component
public class User {
private Long no;
private String name;
@Autowired
private Friend friend;
private List<String> friends;
public User() {
no = 1L;
name = "루피";
}
public User(Long no, String name) {
this.no = no;
this.name = name;
}
public Long getNo() {
return no;
}
public void setNo(Long no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
.
..
...
@Override
public String toString() {
return "User [no=" + no + ", name=" + name + ", friend=" + friend + ", friends=" + friends + "]";
}
}
Friend.java
public class Friend {
private String name;
public Friend(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Friend [name=" + name + "]";
}
}
ContainerTest.xml
<!-- 기본생성자를 Bean으로 등록 -->
<bean id = "user1" class = "kr.co.itcen.springcontainer.user.User" />
<bean id = "user2" name="usr2" class = "kr.co.itcen.springcontainer.user.User" />
<bean id = "user3" class = "kr.co.itcen.springcontainer.user.User" >
<constructor-arg index = "0" value = "1"/>
<constructor-arg index = "1" value = "스펀지밥"/>
<!-- <constructor-arg value = "스펀지밥"/> -->
</bean>
<!-- property설정으로 인자 값을 넣어주려면 해당 객체에 관련 Setter가 있어야 한다. -->
<bean id="user4" class="kr.co.itcen.springcontainer.user.User">
<property name="no" value="4"/>
<property name="name" value="조로"/>
</bean>
<bean id = "user5" class = "kr.co.itcen.springcontainer.user.User" >
<property name="no" value="5"></property>
<property name="name" value="둘리"></property>
<!-- DI -->
<property name="friend" ref="friend1"/>
</bean>
<bean id="friend1" class="kr.co.itcen.springcontainer.user.Friend">
<constructor-arg value="로드 존슨"/>
</bean>
<bean id="user6" class="kr.co.itcen.springcontainer.user.User">
<property name="no" value="6"/>
<property name="name" value="쵸파"/>
<!-- DI라기보다는 객체를 생성해서 집어넣은 것.. -->
<property name="friend" >
<bean class="kr.co.itcen.springcontainer.user.Friend">
<constructor-arg value = "마이콜"/>
</bean>
</property>
<property name="friends">
<list>
<value>아이언맨</value>
<value>캡틴 아메리카</value>
<value>스파이더맨</value>
<value>토르</value>
</list>
</property>
</bean>
ContainerTest.java
ClassPathXmlApplicationContext클래스는 Xml파일만 인식가능한 컨테이너로써, java config로 설정을하기위해서는 다른 컨테이너를 사용해야합니다. ApplicationContext는 컨테이너를 사용하기위한 인터페이스.
public class ContainerTest {
public static void main(String[] args) {
testApplicationContext();
}
public static void testApplicationContext() {
ApplicationContext appCtxt = new ClassPathXmlApplicationContext("config/user/applicationContext01.xml");
// id로 가져오기, id로만 명시했기 때문에 getBean이 어떤 형태인지 모름. 따라서 캐스팅을 해줘야 한다.
User user1 = (User)appCtxt.getBean("user1");
System.out.println(user1);
// name으로 가져오기.
User usr2 = (User)appCtxt.getBean("usr2");
System.out.println(usr2);
// Singleton 확인.
User user2 = (User)appCtxt.getBean("user2");
System.out.println(usr2 == user2);
// User(Long, String) 으로 생성된 빈 가져오기.
User user3 = (User)appCtxt.getBean("user3");
System.out.println(user3);
// User() 으로 생성되고 프로퍼티 세팅을 한(setter) 빈 가져오기.
User user4 = (User)appCtxt.getBean( "user4" );
System.out.println(user4);
// DI 설정한 빈 가져오기.
User user5 = (User)appCtxt.getBean( "user5" );
System.out.println(user5);
// DI 설정한 빈 가져오기 2.
User user6 = (User)appCtxt.getBean( "user6" );
System.out.println(user6);
((ConfigurableApplicationContext)appCtxt).close();
}
}
'Spring' 카테고리의 다른 글
이클립스 Java Build Path와 Deployment Assembly 그리고 target (0) | 2023.05.24 |
---|---|
EJB와 스프링 개론 (0) | 2021.02.23 |
Maven project 와 War, Jar파일 차이 (0) | 2019.09.26 |
Tomcat과 Servlet프로젝트 기본 설정하기 (0) | 2019.09.10 |
이클립스 톰켓(Apache Tomcat) 연동 및 포트 충돌 에러 해결 (3) | 2019.02.13 |