이것은 별다른 변경 사항이 아닙니다. @Configuration
클래스 (또는 AnnotationConfigApplicationContext
)는 @PostConstruct
빈을 호출하는 역할을 담당하는 CommonAnnotationBeanPostProcessor
을 등록합니다. 변경은 거의 모든 Spring IoC 스택을 변경한다는 것을 의미합니다.
실제로 인 경우 이라는 기본값으로 덮어 쓰는 으로 CommonAnnotationBeanPostProcessor
을 선언하면됩니다. init 애노테이션 유형을 null
으로 설정하여 @PostConstruct
을 무시할 수 있습니다.
@Bean(name = "org.springframework.context.annotation.internalCommonAnnotationProcessor")
public CommonAnnotationBeanPostProcessor commonAnnotationBeanPostProcessor() {
CommonAnnotationBeanPostProcessor bean = new CommonAnnotationBeanPostProcessor();
bean.setInitAnnotationType(null);;
return bean;
}
다른 것들을 손상시킬 수 있으므로 사용하는 동안 조심하십시오.
나는 먼저 그 방법을 찾으려고 노력할 것을 권합니다. 예를 들어 ProblematicService
에 액세스 할 수있는 래퍼 객체를 반환합니다.
@Bean
public ServiceProvider provider() {
ProblematicService service = ...;
ServiceProvider provider = new ServiceProvider(service);
return provider;
}
또는 마찬가지로 FactoryBean
을 제안했습니다.
CGLIB 프록시로 객체를 래핑하는 것이 더 시원하고 추악한 방법입니다.
@Bean
public ProblematicService service() {
ProblematicService service = ...;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(service.getClass());
enhancer.setCallback(new MethodInterceptor() {
ProblematicService inner = service;
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
if (!method.getName().equals("initMethodName"))
return method.invoke(inner, args);
return null;
}
});
return (ProblematicService) enhancer.create();
}
기본적으로 init 메소드를 호출 할 수 없습니다.
당신이'ProblematicService'를 생성하는 곳에'@ Bean' problematicService()가 있습니다 만, "다른 코드에 의해 생성되었습니다"라고 당신은 말할 수 있습니다. 당신은 API로부터'ProblematicService'에 접근 할 수 있고 그것을 빌드해야한다고 말하고 싶지만, API는'@ PostConstruct' 주석을 가지고 있습니다. 당신은 그것을 변경할 수 없습니까? –
예, ProblematicService는 이미 내 컨트롤 외부의 코드에서 생성되었습니다. –
당신은 모두'@ PostConstruct' 주석 메소드를 호출 할 것입니까? 'ProblematicService'는'final'으로 선언되어 있습니까? –