자동연결(autowring)과 특수주석(annotation) 사용하기

스프링 컨테이너는 엘레먼트를 사용하지 않고 협업하는 빈들 간에 의존성을 자동연결하는 기능을 가지고 있다.

다음과 같은 자동연결 모드를 통해서 스프링 컨테이너가 의존성 주입을 자동적으로 처리하는 방법을 결정할 수 있다.

  • no : 기본값, 자동연결을 하지 않는다.
  • byName : 속성의 이름과 동일한 이름으로 정의된 빈을 연결한다.
  • byType : 속성의 타입과 동일한 타입으로 정의된 빈을 연결한다. 동일한 타입으로 여러개의 빈이 정의되어 있는 경우에는 예외가 발생한다.
  • constructor : 이것은 byType과 비슷하지만 생성자 타입에서 찾는다는 차이가 있다. 여러개의 빈이 정의되어 있는 경우에는 예외가 발생한다.
  • default : constructor로 자동연결을 시도하는데 처리가 되지 않으면 byType으로 자동연결을 한다.

HelloWorld를 다음과 같이 수정하면, byName으로 자동연결된다.

<bean name="message" class="java.lang.String">
    <constructor-arg value="auto wired" />
</bean>

<bean id="helloWorld" class="com.packt.lifecycle.HelloWorld"
   autowire="byName">
</bean>

실행하면 auto wired가 출력될 것이다.

스프링은 특수주석을 통한 설정도 제공하고 있다.

  • @Required : 빈 속성 설정 메서드(setter)에 적용된다.
  • @Autowired : 빈 속성 설정 메서드(setter), 생성자, 속성들에 적용된다.
  • @Qualifier : @Autowired와 함께 쓰인다. qualifier 이름을 지정할 수 있다.

어노테이션을 통해서 자동연결을 하기 위해서는 어플리케이션 컨텍스트에 다음 내용이 추가되어야 한다.

<context:annotation-config/>

특수주석을 사용할 있게 수정한 어플리케이션 컨텍스트 설정은 다음과 같다.

<?xml version="1.0" encoding="UTF-8"?>
   <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-
   3.0.xsd">
   <context:annotation-config/>
      <bean name="message" id="message" class="java.lang.String">
          <constructor-arg value="auto wired" />
       </bean>
       <bean id="helloWorld" class="com.packt.lifecycle.HelloWorld">
       </bean>
</beans>

HelloWorld 클래스에 특수주석을 적용해 보자. 여기서는 설정 메서드(setMessage)에 특수주석을 붙였지만, message 속성에 @Autowired를 붙여도 된다.

public class HelloWorld implements ApplicationContextAware,BeanNameAware, 
       InitializingBean,BeanFactoryAware,BeanPostProcessor,  DisposableBean {
     private String message;
     public String getMessage() {
       return message;
}
     @Autowired
     public void setMessage(String message) {
       this.message = message;
     }
        //code omitted for brevity
   }

프로그램을 실행하면 auto wired 메시지가 출력된다.