스프링 컨테이너는 초기화 과정에서 몇 가지 빈을 기본적으로 등록해준다.
ApplicationContext, BeanFactory
스프링에서는 컨테이너 자신을 빈으로 등록해두고 필요하면 일반 빈에서 DI 받아서 사용할 수 있다.
스프링 컨테이너인 애플리케이션 컨텍스트는 ApplicationContext 인터페이스를 구현한 것이기 때문에 일반 빈에서 사용하고 싶다면 ApplicationContext 타입의 빈을 DI받도록 해주면 된다. (또한 ApplicationContext는 BeanFactory 인터페이스의 구현체)
1 2 3 4 5 6 | @Autowired ApplicationContext context; public void do(){ this.context.getBean(...); // 애플리케이션 컨텍스트를 직접 사용할 수 있다. } | cs |
만약 어노테이션을 이용해서 의존관계 설정을 사용하지 않는다면 ApplicationContextAware라는 특별한 인터페이스를 구현해서 사용하면 된다.
ApplicationContextAware 에 setApplicationContext() 메소드가 있어 스프링이 애플리케이션 컨텍스트 오브젝트를 DI해줄 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class classA implements ApplicationContextAware{ ApplicationContext ctx; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException{ this.ctx = applicationContext; } public void doSomething(){ ctx.getBean("...."); } } | cs |
ResourceLoader, ApplicationEventPublisher
스프링 컨테이너는 ResourceLoader이기도 하다. 따라서 서버환경에서 다양한 Resource를 로딩할 수 있는 기능을 제공한다.
만약 코드를 통해 서블릿 컨텍스트의 리소스를 읽어오고 싶다면 컨테이너를 ResourceLoader 타입으로 DI 받아서 활용하면 된다.
1 2 3 4 5 6 | @Autowired ResourceLoader resourceLoader; public void loadDataFile(){ Resource resource = this.resourceLoader.getResource("WEB-INF/test.dat"); } | cs |
하지만 ApplicationContext 인터페이스는 이미 ResourceLoader를 상속하고 있다. 따라서 ApplicationContext 타입으로 DI 받아서 getResource() 메소드를 사용해도 된다.
하지만 단지 리소스를 읽어오려는 목적이라면 용도에 맞게 적절한 인터페이스 타입을 DI받아서 사용하는 것이 바람직하다.
ApplicationEventPublisher는 ApplicationListener 인터페이스를 구현한 빈에게 이벤트를 발생시킬 수 있는 publishEvent() 메소드를 가진 인터페이스다. 이 역시 ApplicationContext가 상속하고 있는 인터페이스의 한 가지다.
SystemProperties, SystemEnvironment
스프링 컨테이너가 직접 등록하는 빈 중에서 타입이 아니라 이름을 통해 접근할 수 있는 두 가지 빈이 있다.
systemProperties 빈과 systemEnvironment 빈 (각각 Properties 타입과 Map 타입)
systemProperties는 System.getProperties() 메소드가 돌려주는 Properties 타입의 오브젝트를 읽기전용으로 접근할 수 있게 만든 빈 오브젝트다.
JVM이 생성해주는 시스템 프로퍼티 값을 읽을 수 있게 해준다.
이름을 통한 빈 접근
@Resource Properties systemProperties;
특정한 값을 가져올 경우
@Value("#{systemProperties['os.name']}")
String osName;
(출처 : 토비의 스프링)
'프로그래밍 노트 > SPRING' 카테고리의 다른 글
[Spring] 팩토리빈과 팩토리메소드 (0) | 2018.09.09 |
---|---|
[Spring] 빈(bean)생명주기 메소드 (0) | 2018.09.09 |
[Spring] 프로퍼티(properties) 다루기 (0) | 2018.09.07 |
[Spring] IoC(InversionOfControl) 컨테이너 6 (빈 등록 메타정보 구성 전략) (0) | 2018.08.28 |
[Spring] IoC(InversionOfControl) 컨테이너 5 (빈 등록방법) (0) | 2018.08.27 |