我的项目提供了许多(nuuuuumbeeeeer)基类,开发人员可以随意扩展这些基类,并且必须将其声明为 Spring bean 到 XML 配置中。
我已经知道注释配置是从基类继承的,但我们主要使用XML
@SpringAnnotation
public abstract class Parent{}
//Will apply any @SpringAnnotation
public class Child{}
我想做的是在基类中进行自检。如果开发人员忘记将 bean 的范围设置为记录的值(例如,对于当前示例,“请求”),我希望继承的 bean 抛出异常,提醒开发人员更改范围。
例如
public void afterPropertiesSet()
{
if (!thisBean.getScope().equals("request"))
throw new BeansException("Sorry but this bean works only when it is a request bean");
}
我发现Spring没有定义任何类型的BeanDefinitionAware
,它可能会将bean自己的定义(以及范围和很多东西)注入(inject)到bean本身中。
有什么想法吗?我可能很快就会提出一个自制的解决方案。
最佳答案
您可以定义一个实现BeanFactoryPostProcessor
的bean界面。
正如BeanFactoryPostProcessor Spring doc中报道的那样,一个实现 BeanFactoryPostProcessor
的 bean当所有 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实例交互,请考虑实现BeanPostProcessor
相反。
关于java - 如何自检Spring bean作用域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46443113/