스프링의 빈 등록
스프링은 지정된 클래스 이름을 가지고 리플렉션을 이용해 빈을 생성한다.
하지만, 스프링에서 DI 할 수 없는 클래스의 빈이 있을 수도 있음 -> 정보를 미리 알아낼 수 없는 경우
- Dynamic Proxy로 만드는 객체의 경우, 클래스를 미리 알 수 없음
- new 연산자로 생성할 수 없는 객체
- Third-Party에서 제공하는 클래스 등
-> 이를 위해 스프링에서 FactoryBean 클래스 제공
FactoryBean
FactoryBean 인터페이스
public interface FactoryBean {
T getObject() throws Exception;
Class<?> getObjectType();
boolean isSingleton();
}
- getObject() : 팩토리에 의해 만들어진 객체 반환 -> 반환되는 객체는 빈으로 등록되며 싱글톤으로 관리된다.
- getObjectType() : FactoryBean이 만든 객체 타입 반환
- isSingleTon() : FactoryBean이 싱글톤 여부 반환
ApplicationContextAware
ApplicationContextAware 인터페이스
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
- 빈이 ApplicationContextAware 인터페이스를 구현하면, 빈 생성 및 의존성 주입 완료 후에 setApplicationContext()를 호출한다. 이를 통해 빈은 자신의 인스턴스를 생성 및 관리하는 ApplicationContext가 어떤 인스턴스인지 확인하고 접근할 수 있다.
- 즉, 빈을 관리하는 ApplicationContext 인스턴스에 직접 접근이 필요한 경우 사용하는 인터페이스이다.
BeanExample 클래스를 빈으로 등록해보자
BeanExample.java : FactoryBean, ApplicationContextAware 구현
package smartsuite.app.bp.edoc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class BeanExample implements FactoryBean<BeanExample>, ApplicationContextAware {
private final static Logger LOG = LoggerFactory.getLogger(BeanExample.class);
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@Override
public BeanExample getObject() throws Exception {
return (BeanExample) applicationContext.getBean(BeanExample.class);
}
@Override
public Class<BeanExample> getObjectType() {
return BeanExample.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
context에 빈 등록

'Spring' 카테고리의 다른 글
| [Spring] AbstractAuthenticationProcessingFilter : Spring Security의 로그인 인증 동작 방법 (0) | 2024.08.20 |
|---|---|
| [Spring] Spring Security에 대하여 (0) | 2024.08.20 |