Whiteship's Note


BeanLifeCycle 인터페이스를 없애보자.

Spring/Chapter 3 : 2008.09.22 16:50


BeanLifeCycle에 등장하는 여러 인터페이스 들 중에서 BeanFactoryAware, ApplicationContextAware, MessageSoruceAware, ApplicationEventPublisherAware, ResourceLoaderAware 인터페이스를 사용하지 않고도 이들이 해주는 일과 똑같은 작업을 할 수 있습니다.

@Component
public class Bean {

    @Autowired
    ApplicationContext applicationContext;
   
    @Autowired
    MessageSource messageSource;
   
    @Autowired
    ApplicationEventPublisher applicationEventPublisher;

    @Autowired
    ResourceLoader resourceLoader;
   
    @Autowired
    BeanFactory beanFactory;
   
}

이런식으로 @Autowired를 사용하시면 됩니다. 물론 저 중에서 BeanFactory를 뺀 나머지는 ApplicationContext를 사용할 때 이용할 수 있겠죠. 라이프사이클 중에 InitializingBean 인터페이스는 bean 엘리먼트의 init-method 또는 @PostConstruct를 사용하면 대체할 수 있습니다.

꼭 필요하진 않고, 있을 때만 주입하고 싶다면, @Autowired(required=false) 이렇게 설정하면 되겠죠.

다음은 위 코드의 테스트 코드입니다,.

@ContextConfiguration(locations="springContext.xml")
public class BeanTest extends AbstractJUnit4SpringContextTests{

    @Autowired
    Bean bean;
   
    @Test
    public void lifecycle() {
        assertNotNull(bean.beanFactory);
        assertNotNull(bean.applicationContext);
        assertNotNull(bean.messageSource);
        assertNotNull(bean.applicationEventPublisher);
        assertNotNull(bean.resourceLoader);
    }
   
}

테스트는 당연히 잘 돌아갑니다.

아차. 빈 설정파일은 딱 두 줄 한 줄 입니다.
    <context:component-scan base-package="org.opensprout.sandbox.lifecycle" />
   
    <context:annotation-config />

top

  1. Favicon of http://toby.epril.com BlogIcon '토비 2008.09.22 18:27 PERM. MOD/DEL REPLY

    XML 설정에 문제가 있꾼!

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2008.09.22 22:27 신고 PERM MOD/DEL

    헉;;; 한줄로 줄일 수 있군요.

    context:component-scan 이 엘리먼트 등록하면 <context:annotation-config /> 얘도 등록한셈이 되는거죠.

    ㅎㅎ감사합니다.

Write a comment.


BeanNameAware 테스트

Spring/Chapter 3 : 2007.05.09 01:45


public class BeanLifeCycleTestBean implements BeanNameAware{

    String beanName;

    public void setBeanName(String beanName) {
        this.beanName = beanName;
    }

    public String getBeanName(){
        return beanName;
    }

}

위와 같이 BeanNameAware 클레스를 구현해 놓고 다음과 같이 간단히 Bean으로 등록합니다.

<bean id="test" class="net.agilejava.jedi.spring.beanLifeCycle.BeanLifeCycleTestBean" />

테스트 코드를 다음과 같이 작성하고 돌려보면...

public class BeanLifeCycleTest {

    private ApplicationContext context;

    @Test
    public void testBeanNameAware() {
        context = new ClassPathXmlApplicationContext("net/agilejava/jedi/spring/beanLifeCycle/applicationContext.xml");
        BeanLifeCycleTestBean bean = (BeanLifeCycleTestBean) context.getBean("test");
        assertEquals("test", bean.getBeanName());
    }

}

녹색 막대를 확인할 수 있습니다.

이 인터페이스를 구현한 Spring의 소스 코드로는 다음과 같은 것들이 있습니다.
- ServletForwardingController
- AbstractView :: Set the view's name. Helpful for traceability.
- PortletWrappingController
- GenericFilterBean :: Stores the bean name as defined in the Spring bean factory. Only relevant in case of initialization as bean, to have a name as fallback to the filter name usually provided by a FilterConfig instance.
- JobDetailBean
- OsgiServiceProxyFactoryBean :: To find a bean published as a service by the OsgiServiceExporter, simply set this property. You may specify additional filtering criteria if needed (using the filter property) but this is not required.
- AbstractTest
- EhCacheFactoryBean
- FieldRetrievingFactoryBean :: The bean name of this FieldRetrievingFactoryBean will be interpreted as "staticField" pattern, if neither "targetClass" nor "targetObject" nor "targetField" have been specified. This allows for concise bean definitions with just an id/name.

각각의 소스코드 위에 붙어있던 JavaDoc을 보면 설정 파일에서 사용하는 bean 이름을 알면 유용한 경우가 있는 듯 합니다.
- Bean을 추적하거나 찾을 때 사용
- 특정 Bean 이름으로 필터링 할 때 사용합니다.
Interface to be implemented by beans that want to be aware of their bean name in a bean factory. Note that it is not usually recommended that an object depend on its bean name, as this represents a potentially brittle dependence on external configuration, as well as a possibly unnecessary dependence on a Spring API.
Spring API에서 인용한 부분을 보면 빈 설정의 빈 이름에 빈이 종속 되도록 하는 것을 권장하지 않습니다. 이유는 빈이 외부의 설정 파일에 종속되게 되며 이것은 Spring API에 종속되는 거나 마찬가지기 때문이라고 합니다.

top

Write a comment.