Dies ist eine nicht-triviale Änderung. Eine @Configuration
Klasse (oder besser gesagt die AnnotationConfigApplicationContext
) registriert eine CommonAnnotationBeanPostProcessor
, die für den Aufruf der -Methode einer Bean zuständig ist. Das würde bedeuten, fast den gesamten Spring IoC Stack zu ändern.
Eigentlich, Sie könnten nur einen CommonAnnotationBeanPostProcessor
mit einem Bohnen Namen org.springframework.context.annotation.internalCommonAnnotationProcessor
erklären, die man die Standardeinstellung überschreiben wird. Sie können den Init-Annotationstyp auf null
setzen, sodass er ignoriert.
@Bean(name = "org.springframework.context.annotation.internalCommonAnnotationProcessor")
public CommonAnnotationBeanPostProcessor commonAnnotationBeanPostProcessor() {
CommonAnnotationBeanPostProcessor bean = new CommonAnnotationBeanPostProcessor();
bean.setInitAnnotationType(null);;
return bean;
}
Vorsichtig bei der Verwendung dieser, wie es andere Dinge brechen könnte.
Ich werde zuerst empfehlen, zu versuchen und einen Weg darum zu finden. Geben Sie beispielsweise ein Wrapper-Objekt zurück, mit dem Sie auf die ProblematicService
zugreifen können.
@Bean
public ServiceProvider provider() {
ProblematicService service = ...;
ServiceProvider provider = new ServiceProvider(service);
return provider;
}
Oder ähnlich die FactoryBean
Sie vorgeschlagen.
Eine andere, kühlere, aber hässlichere Methode ist das Wrapping des Objekts in einen CGLIB-Proxy.
@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();
}
Grundsätzlich kann die init-Methode nie aufgerufen werden.
Ich verstehe nicht: Sie haben eine 'Bean @ problematicService(), wo Sie einen' ProblemService' konstruieren, aber Sie sagen, dass es "für mich von anderen Code erstellt". Sie möchten sagen, dass Sie über eine API Zugriff auf 'ProblemService 'haben und Sie müssen es erstellen, aber die API kommt mit einer' @ PostConstruct' Annotation und Sie können das nicht ändern? –
Ja, ProblemematicService kommt mir bereits aus Code außerhalb meiner Kontrolle. –
Werden Sie die annotierte Methode @ PostConstruct aufrufen? Und wird "Problemservice" als "endgültig" deklariert? –