Spring

Spring Container에 Bean등록(Xml) 및 사용 예시

천방지축 개발노트 2019. 10. 15. 15:46

 

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 Container running