java - 如何自检Spring bean作用域?

标签 java spring

我的项目提供了许多(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/

相关文章:

java - 在 Android 类 ID 和方法 ID 中从 C++ 调用 Java 方法

java - java play框架将json转换为字符串列表时出错

java - Spring-JDBC中的隔离级别SERIALIZABLE

Spring+JSP url构建最佳实践

java - Caused by: java.lang.IllegalArgumentException: error at::0 找不到引用的切入点

spring - 使用 Spring Integration TCP IP 套接字发送和接收数据

java - 使用 jquery 在文本字段中显示 servlet 结果

java - HIVE:NoSuchMethodError:org.fusesource.jansi.internal.Kernel32.GetConsoleOutputCP()I

java - Jquery post到Spring Controller 返回java bean以进行jSTL解析

java - Spring数据JPA : InvalidDataAccessApiUsageException for @Transactional