Web/Spring 2019. 2. 25. 15:57

Spring - ApplicationContext,ApplicationContextAware, 빈이 아닌 객체에 빈주입할때!



@Autuwired,@Inject 등의 어노테이션으로 의존주입을 하기 위해서는 해당 객체가 빈으로 등록되어 있어야만 가능하다.

사실 이런 상황은 웹프로그래밍에서는 거의 없겠지만... 빈으로 등록되지 않은 객체에 빈으로 등록된 객체를 의존주입해야할 상황이 있을 수도 있다.

 그럴때 사용할수 있는 하나의 UtilClass 이다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Service
public class BeanUtils implements ApplicationContextAware {
 
    private static ApplicationContext context;
    
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        // TODO Auto-generated method stub
        context = applicationContext;
    }
 
    public static <T> T getBean(Class<T> beanClass) {
        return context.getBean(beanClass);
    }
}
cs


ApplicationContextAware를 구현한 BeanUtils 클래스를 하나 만들었다. 그리고 setApplicationContext() 메소드로 ApplicationContext를 

주입받고 있는 상황이다. 그리고 static으로 선언된 getBean 메소드를 이용하여 빈주입을 원하는 어딘가에서


BeanUtils.getBean()를 호출하여 빈을 주입받을 수 있다.!

posted by 여성게
:
Web/Spring 2018. 7. 28. 21:57

<bean>의 depends-on 속성




applicationContext.xml에 빈정의에 대한 설정을 모두 마치고 실행하게 되면 빈의 생성은 선언한 순서대로 생성이 된다.(만약 의존하는 빈이 다른 위치에 있다면 그 빈을 먼저 생성하고 다시 순서대로 내려온다.) 하지만 명시적으로 의존성이 들어나지 않고 암시적으로 빈이 어떠한 다른 빈을 의존하고 있는 경우가 있을 수 있다. 만약 명시적으로 의존이 들어나 있다면 스프링컨테이너는 알아서 순서에 맞춰 빈을 생성해 주지만 암시적으로 겉으로 들어나지 않은 의존성 같은 경우는 컨테이너도 어쩔수가 없다. 


예를 들면, 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<bean id="service"
        class="sample.spring.chapter04.bankapp.service.FixedDepositServiceImpl">
        <property name="fixedDepositDao">
            <bean class="sample.spring.chapter04.bankapp.dao.FixedDepositDaoImpl" />
        </property>
        <constructor-arg index="0"
            value="META-INF/config/appConfig.properties" />
    </bean>
 
    <bean id="eventSenderSelectorService"
        class="sample.spring.chapter04.bankapp.service.EventSenderSelectorServiceImpl">
        <constructor-arg index="0"
            value="META-INF/config/appConfig.properties" />
    </bean>
cs

 

eventSenderSelectorService라는 빈이 생성될때, appConfig.properties 파일에 어떠한 정보를 남겨준다. 그러면 service 빈이 그 appConfig.properties 파일에 작성된 정보를 이용하여 빈생성과정이 이루어진다. 위의 설정파일에서는 암시적으로 service 빈이 eventSenderSelectorService 빈을 의존하고 있는 것이다. 그래서 service 빈이 먼저 생성되는 과정이 된다면? 빈생성 과정에서 오류가 생기고 말것이다. (eventSenderSelectorService 빈 생성이 먼저 이루어져야함으로) 여기서 사용할 수 있는 속성이 depends-on 속성이다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<bean id="service"
        class="sample.spring.chapter04.bankapp.service.FixedDepositServiceImpl"
           depends-on="eventSenderSelectorService ">
        <property name="fixedDepositDao">
            <bean class="sample.spring.chapter04.bankapp.dao.FixedDepositDaoImpl" />
        </property>
        <constructor-arg index="0"
            value="META-INF/config/appConfig.properties" />
    </bean>
 
    <bean id="eventSenderSelectorService"
        class="sample.spring.chapter04.bankapp.service.EventSenderSelectorServiceImpl">
        <constructor-arg index="0"
            value="META-INF/config/appConfig.properties" />
    </bean>
cs

이렇게 depends-on으로 의존하고 있는 빈을 들어내줌으로써 eventSenderSelectorService 빈을 먼저 생성한 후에 service 빈을 생성한다.



depends-on속성에는 ","을 구분자로 여러개의 빈을 의존하고 있음을 명시할 수 있다.

하지만 이 속성은 자식 빈정의에는 상속되지 않는 속성임에 주의해야한다.(부모빈에 이 속성이 정의되어 있어도 자식에는 상속되지 않음)

posted by 여성게
: