我的项目提供了一个基类的数量(一个nuuuuumbeeeeer),开发人员可以扩展到它们的舒适度,并且必须将Spring bean声明为XML配置。
我已经知道 annotation config 是从基类继承的,但我们主要使用XML
@SpringAnnotation
public abstract class Parent{}
//Will apply any @SpringAnnotation
public class Child{}
我想要做的是在基类中进行自我检查。如果开发人员忘记将bean的范围设置为记录的值(例如,"请求",对于当前示例),我希望继承的bean引发异常,提醒开发人员更改范围
E.g。
public void afterPropertiesSet()
{
if (!thisBean.getScope().equals("request"))
throw new BeansException("Sorry but this bean works only when it is a request bean");
}
我已经看到Spring没有定义任何可能将bean自己的定义(以及范围和很多东西)注入bean本身的BeanDefinitionAware
。
有什么想法吗?我很快就会带着自制的解决方案。
答案 0 :(得分:2)
您可以定义实现BeanFactoryPostProcessor
接口的bean。
正如BeanFactoryPostProcessor Spring doc中所报告的,当所有bean定义都已加载时,将调用实现BeanFactoryPostProcessor
的bean,但尚未实例化bean。这样,您将能够读取所有bean定义并检查bean是否已正确配置。
这是一个例子:
public class CustomBeanFactory implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
for (String beanName : beanFactory.getBeanDefinitionNames()) {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
// Analyze the bean definition
}
}
}
最后但并非最不重要的是,请记住BeanFactoryPostProcessor
可以与bean定义进行交互并修改bean定义,但绝不能与bean实例进行交互。这样做可能会导致bean过早实例化,违反容器并导致意外的副作用。如果需要bean实例交互,请考虑实现BeanPostProcessor
。