1.2.5 컨테이너가 자동등록하는 빈
- 스프링 컨테이너는 초기화 과정에서 몇 가지 빈을 기본적으로 등록 (자주 사용 X)
ApplicationContext, BeanFactory
- 스프링에서는 컨테이너 자신을 빈으로 등록해두고 필요하면 일반 빈에서 DI 받아 사용 가능
- 스프링 컨테이너는
ApplicationContext
인터페이스를 구현체
- @Autowired로 자동와이어링을 이용하는 방법이 가장 쉬운 방법 (@Resource도 사용 가능)
public class SystemBean { @Autowired ApplicationContext context; public void specialJobWithContext() { this.context.getBean(...); } }
- 애노테이션을 이용한 설정을 못쓴다면
ApplicationContextAware
인터페이스를 구현하면 가능ApplicationContextAware
에setApplicationContext()
메소드가 있어 스프링이 애플리케이션 컨텍스트 오브젝트를 DI해주는게 가능
ApplicationContext
인터페이스는BeanFactory
인터페이스를 상속
ApplicationContext
의 구현 클래스는 기본적으로BeanFactory
의 기능을 직접 구현하고 있지 않고 내부에 빈 팩토리 오브젝트를 별도로 만들어두고 위임하는 방식을 사용
- 빈 팩토리는
ApplicationContext
구현 클래스 안에 내부적으로 따로 생성해두기 때문에BeanFactory
로 DI 받는 오브젝트는ApplicationContext
로 가져오는 오브젝트와 다름@Autowired BeanFactory beanFactory;
- 스프링의 내부 구조를 자세히 알고 특별한 기능을 이용해야하는 경우에만 사용을 추천
ResourceLoader, ApplicationEventPublisher
- 스프링 컨테이너는 ResourceLoader역할도 가능
- 서버환경에서 다양한 Resource를 로딩할 수 있는 기능을 제공
- 웹 애플리케이션으로 배포된 스프링은 기본적으로 서블릿 컨텍스트의 리소스를 이용하도록 ResourceLoader가 구성
- @Autowired를 이용하거나 ResourceLoaderAware 인터페이스를 구현해주면 사용 가능
@Autowired ResourceLoader resourceLoader; public void loadDataFile() { Resource resource = this.resourceLoader.getResource("WEB-INF/info.dat"); }
ApplicationEventPublisher
는ApplicationListener
인터페이스를 구현한 빈에게 이벤트를 발생시킬 수 있는publishEvent()
를 가진 인터페이스ApplicationContext
가 상속하고 있는 인터페이스
- 빈 사이에 이벤트/리스너 구성을 하면 충분하기 때문에 거의 사용X (컨테이너에 의존적)
systemProperties, systemEnvironment
- 스프링 컨테이너가 직접 등록하는 빈 중에서 이름을 통해 접근할 수 있는 두가지 빈
systemProperties
은System.getProperties()
가 돌려주는Properties
타입의 오브젝트를 읽거전용으로 접근할 수 있게 만든 빈 오브젝트- JVM이 생성해주는 시스템 프로퍼티 값을 제공받음
- 스프링의 빈 프로퍼티에 시스템 프로퍼티 값을 넣어줄때
SystemProperties
빈을 이용하면 편리@Resource Properties systemProperties;
systemProperties
빈을 통쨰로 가져오는 방봅도 좋지만 SpEL을 사용하는게 간편@Value("#{systemProperties['os.name']}") String osName;
systemEnvironment
는system.getenv()
에서 제공하는 환경변수가 담긴 Map 오브젝트- OS의 종류나 서버환경 설정에 따라 달라질 수 있음
@Value("#{systemEnvironment['Path']}") String path;
systemProperties
나systemEnvironment
라는 이름의 빈을 직접 정의해두면 스프링이 이 빈들을 자동으로 추가하지 못하기 때문에 주의가 필요. (이름 사용 금지)
'개발서적 > 토비 스프링 3.1-Vol.2' 카테고리의 다른 글
[토비의 스프링 - Vol.2] 1장 - 1.4 기타 빈 설정 메타정보 (0) | 2022.01.17 |
---|---|
[토비의 스프링 - Vol.2] 1장 - 1.3 프로토타입과 스코프 (0) | 2022.01.17 |
[토비의 스프링 - Vol.2] 1장 - 1.2.4 프로퍼티 값 설정 방법 (0) | 2022.01.17 |
[토비의 스프링 - Vol.2] 1장 - 1.2.3 빈 의존관계 설정 방법 (0) | 2022.01.17 |
[토비의 스프링 - Vol.2] 1장 - 1.2.2 빈 등록 방법 (0) | 2021.07.06 |