如何自我检查Spring bean范围?

时间:2017-09-27 08:35:40

标签: java spring

我的项目提供了一个基类的数量(一个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

有什么想法吗?我很快就会带着自制的解决方案。

1 个答案:

答案 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