【问题标题】:Detect all beans have been instantiated in Spring framework检测所有bean是否已在Spring框架中实例化
【发布时间】:2014-06-27 02:15:14
【问题描述】:

请问有没有办法检测到Spring框架中所有的bean都已经实例化了?

我正在使用 Spring 库的 FileSystemXmlApplicationContext 类来加载我的 Spring 配置 XML。

我明白,在 bean 工厂实例化之后,我可以获得所有 bean。我的愚蠢解决方案是在 Spring API 中使用 getBean(String name) 方法,并在 Spring 配置 XML 中检查所有需要的 bean。如果可以找到所有需要的 bean,我可以推断所有 bean 都已实例化。

我不喜欢愚蠢的解决方案的原因是每当我更新我的配置 XML 时,我都需要更新我的源代码以再次检查。如果此解决方案存在更多漏洞,请随时指出。

感谢您的宝贵时间和建议

【问题讨论】:

  • 当您在控制台中启动应用程序时,您可以看到您的 spring bean。您可以通过搜索已知 bean 来检查
  • @Fede 这是我的愚蠢解决方案吗?
  • 我不明白您为什么要检查 bean 是否已实例化。你不相信春天吗?还是相信你写的xml?
  • @ohiocowboy 很好的查询,我相信 Spring 并且已经测试了我编写的 XML。工作得很好。但是我需要让我的系统在所有 bean 都成功加载并实例化之后删除那些配置 XML 文件。这是出于安全考虑。

标签: java spring


【解决方案1】:

您可以将 BeanPostProcessor 添加到您的上下文中

class B1 implements BeanPostProcessor {
    List beans = new ArrayList();
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {
        beans.add(bean);
        return bean;
    }

    List getBeans() {
        return beans;
    }
...

【讨论】:

  • 谢谢,我先试试!
  • Evgeniy Dorofeev,在我从 BeanPostProcessory 实例化所有 bean 之后,我想我仍然需要检查配置文件中所需的 bean,不是吗?
  • 我认为你不需要它,postProcessBeforeInitialization 会为配置中的所有 bean 调用,因此列表将包含所有可用的 bean
【解决方案2】:

使用getBeansOfType(Object.class)怎么样?

您将获得一个包含应用程序上下文中所有名称-bean 对的映射。这也是一个包含非单例的版本,但您只能获得顶级 bean。

【讨论】:

    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多