IoC in Spring : ApplicationContext

ApplicationContext


ApplicationContext인터페이스는 BeanFactory를 상속한다. 해서 BeanFactory의 Bean관리 기능 뿐만 아니라, 트랜젝션과 AOP서비스, 국제화를 위한 메시지 소스(i18n), 어플리케이션 이벤트 처리 등 다른 서비스도 함께 제공한다. 



BeanFactory와 ApplicationContext 비교

 BeanFactory

 ApplicationContext 

 Bean 생성 및 lifeCycle 관리 (layz-loading)

  Bean 생성 및 lifeCycle 관리 (pre-loading)

 

  transaction서비스

 

  aop서비스

 

  국제화를 위한 메시지 소스(i18n)

 

  어플리케이션 이벤트 처리

   WAS환경에서 ContextLoaderListener를 통한 부트스트랩

 

* lazy-loading : 컨테이너 부트스트랩 이후 요청 받을 때 bean을 생성하는 방식.

* pre-laoding : 컨테이너가 부트스트랩 시점에 bean을 모두 생성해 놓는 방식.



ApplicationContext 설정방식 비교 (XML or Java Annotation)


스프링은 본래 properties파일과 xml파일을 통해서만 빈선언을 지원하는데, 버젼 2.5를 시작으로 ApplicationContext를 설정할 때 자바 어노테이션을 지원하기 시작하였다. 두 가지 방식 모두 각기 장단점이 있으며 함께 사용할 수 도 있다. 가장 많이 사용되는 방법은 xml과 Annotation을 병형하는 방법이라고 한다.

 

  1. xml : 모든 설정파일을 외부화 하여 관리하는 것이 가능.
  2. Annotation : 개발소스와 설정관련 Annotation이 함께 있을 수 밖에 없음. 
  3. xml+Annotation : 두가지를 병행하여 설정하는 것도 가능.

 

 

  • 어플리케이션 인프라 스트럭쳐(데이터소스, 트랜젝션메니져, JMS커넥션팩토리, JMX 등)은 xml로 관리하고
  •  Bean에 관한 DI설정은 Annotation에 정의 하는 방법이 유행 (주로 비지니스 로직)

 

아마도 인프라 관련된 설정들은 xml로 작성하는 것이 아키텍쳐 관리자나 fwk담당자가 유지보수나 변경사항에 빠르게 대응하고 전체 시스템 구성을 xml을 보고 파악하는 것이 쉽기 때문이고,  Bean에 관한 DI설정은 Annoation을 이용하는 것은 업무 개발자들이 비지니스 로직을 작성할 때 별도의 설정파일을 관리하지 않고 java 소스내에서 DI를 지정하여 생산성 향상을 꾀하기 때문일 것이다.


 

[일반적인 bean에 관한 spring-xml 설정]

1
2
3
4
5
6
7
8
9
10
11
12
 
<?xml version="1.0" encoding="UTF-8"?>
                        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    
    <!-- IMessageProvider Bean 정의 -->                
    <bean id="messageProvider" name="SimplMessageProvider" 
class="com.ljs.beanfactory.message.SimpleMessageProvider"/>
    
</beans>

cs

  

[spring-annotation 설정]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8"?>
    
    
    <!--스프링이 코드기반에서 의존성 요구조건을 스캔하게끔 세팅 (@Autowired, @Resource...)-->    
    <context:annotation-config/>
    
    <!--스프링이 코드에서 지정된 패키지(및 하위)에 있는 주입 가능한 빈을 모두 스캔하도록 세팅-->
    <context:component-scan base-package="com.ljs.appctxexample"/>
    
</beans>


cs

 

* 추가설명

1
2
3
<context:component-scan base-package="com.ljs.appctxexample"/>
    <context:exclude-filter type="assignable" expression="com.ljs.NotAService"/>
</context:component-scan>
cs

위와 같은 방식으로 context:component-scan 태그에 특정 클래스는 주입대상 클래스에서 제외할 수 있다.

type=annotation, regex, assignable, AspectJ, custom을 조건으로, expression의 형식은 type에 따라 다르다.


* 네임스페이스 설명

xmlns:context : ApplicationContext를 설정하는 지원기능 제공

xmlns:p : Setter주입을 쉽게 할 수 있는 DI설정 제공

xmlns:c : Constructor주입을 쉽게 할 수 있는 DI설정 제공

xmlns:util : DI설정에 유용한 유틸리티 제공


이 글을 공유하기

댓글

Email by JB FACTORY