我正在尝试分析bean配置,我想在特定情况下记录一些消息。我认为BeanFactoryPostProcessor
是正确的地方。但是,当我遍历beanDefinitions
并调用getDestroyMethodName
或getInitMethodName
时,它始终返回null。
我通过@PostConstruct
和@PreDestroy
指定了init和destroy方法
我正在使用注释配置:
@ComponentScan
@Configuration
public class SpringConfig {
}
豆:
@Component
//@Scope("prototype")
public class SomeBean{
@PostConstruct
public void init() {
//Do stuff...
}
@PreDestroy
public void destroy() {
//Do stuff...
}
}
的BeanFactoryPostProcessor:
@Component
public class LogAlertBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
AbstractBeanDefinition beanDefinition = null;
for (String beanDefinitionName : beanDefinitionNames) {
beanDefinition = (AbstractBeanDefinition) beanFactory.getBeanDefinition(beanDefinitionName);
//beanDefinition.getDestroyMethodName() always NULL!!!
if (beanDefinition.isPrototype() && beanDefinition.getDestroyMethodName() != null) {
System.out.println("Destroy method in \"" + beanDefinitionName + "\" bean won't be called!!!");
}
}
}
}
在任何情况下,方法getDestroyMethodName
或getInitMethodName
都会返回null,尽管调用了init和destroy方法。有谁知道为什么会这样?