【问题标题】:Spring does not find beans generated by annotationsSpring找不到注解生成的bean
【发布时间】:2013-01-20 13:38:25
【问题描述】:

我想从我的 spring 上下文中检索属于某个类(或子类)的所有 bean。但这仅检测由 xml 专门定义的 bean。由注解定义的 Bean,例如 @Service,在此处不会被检测到。 (尽管在应用程序内部,它们被完美地检测、初始化和自动装配)。

GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("*-context.xml");
Map<String, DataUpdater> beans = ctx.getBeansOfType(MyClass.class, true, true);
// why are beans missing?

【问题讨论】:

  • 您的*-context.xml 文件是否有&lt;component-scan&gt; 元素?
  • 是的,我有一个组件扫描。并且带注释的类被检测、实例化(在构造方法中按打印)并自动连接到其他 bean(在 setter 方法中按打印)。但我无法从外界获得它们。
  • 您尝试在 XmlApplicationContext 中准确搜索您的 bean,但此上下文仅包含在此 xml 中声明的 bean。必须在 AnnotationConfigApplicationContext(JConfig.class); 中搜索;
  • @AlexeySviridov,不,我不需要 annotationConfigApplicationContext,因为我用于实例化 bean 的主要来源是 xml 文件。但是 xml (compnent-scan) 文件中的一些 bean 正在实例化其他 bean 和那些我似乎找不到的“二级”bean。
  • @flybywire,哦,我现在明白了。无论如何,我认为您的问题有些 - 您在一个仅包含其中定义的 bean 的上下文中搜索。但是您必须在一些全局应用程序上下文中搜索,其中包含您定义的所有已解析 bean。即查看我编辑的答案

标签: java spring inversion-of-control spring-3


【解决方案1】:

对不起,一些愚蠢的错误...我没有正确加载我的 xml 文件,但是作为某些后台进程实例化的 bean 正在使用正确的文件创建并行 xml 上下文。

【讨论】:

    【解决方案2】:

    我见过类似的问题,但我从来没有让getBeansOfType() 正常工作。我的解决方案:

    @Autowired
    public void setMyClasses( List<MyClass> beans ) {
        ...
    }
    

    Spring 会以某种方式收集列表并将其注入。如果不需要知道何时注入列表,也可以将其作为字段注入:

    @Autowired
    private List<MyClass> beans;
    

    【讨论】:

      【解决方案3】:

      您还必须在

      中搜索您的 bean
      AnnotationConfigApplicationContext
      

      如果你想在 XmlContext 和 AnnotationContext 中搜索,你必须将它们与

       @ImportResource("classpath:xmlcontext.xml")
      

      在带注释的配置中

      或者你可以尝试实现ApplicationContextAware接口并在它提供的上下文中搜索。

      【讨论】:

        猜你喜欢
        • 2016-10-31
        • 2011-09-09
        • 1970-01-01
        • 1970-01-01
        • 2018-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多