【问题标题】:getBeansOfType inside a Configuration Class配置类中的 getBeansOfType
【发布时间】:2012-01-07 12:30:30
【问题描述】:

我的 Spring 课程有问题。我需要在 Configuration 类中获取所有类型的 Bean 以将它们提供给另一个类。

现在的问题是,除非我启动 ApplicationContext,否则我不能这样做,但这不起作用,因为我调用的 Config 类使用我调用的 config 类,所以我得到了一个无限循环...

例如:

@Configuration
@Import(Calling.class)
public class MyConfig{
@Bean
public ExampleClass aBean(){
...
return aObject;
}
}

@Configuration
@Import(MyConfig.class)
public class Calling{

@Bean
public Foo anotherBean(){
ConfigurableApplicationContext ctx = new AnnotationConfigApplicationContext(myConfig.class);
ctx.getBeansOfType(ExampleClass.class);
return aObject;
}
}

我可以使用任何功能或模式来获取这些 Bean 吗?

【问题讨论】:

    标签: java spring configuration javabeans applicationcontext


    【解决方案1】:

    对于@Configuration,您需要非常小心,不要从上下文中“拉取”bean,因为您经常会遇到这些无限循环。

    试试这个:

    @Configuration
    @Import(Calling.class)
    public class MyConfig {
       @Bean
       public ExampleClass aBean() {
          ...
          return aObject;
       }
    }
    

    @Configuration
    public class Calling {
    
       private @Autowired List<ExampleClass> exampleBeans;
    
       @Bean
       public Foo anotherBean() {
          return aObject;
       }
    }
    

    这种声明式方法有望解决无限循环问题。

    还要注意,你应该避免循环@Import。如上例所示,仅朝一个方向执行。

    【讨论】:

    • 好吧,看起来不错,但是:我无法创建 Calling 类,因为它依赖于 MyConfig 类...当我启动我的应用程序时,加载了 MyConfig 类,然后 @ 987654328@ 已导入,但此时 MyConfig 尚不存在,因此 Calling 想要 ExampleClasses 但此处失败...
    • 我现在这样解决了:我创建了一个 List&lt;ExampleClass&gt; 并用一个空列表对其进行了初始化。我还创建了一个方法setList(List&lt;ExampleClass&gt;),即@Autowired。在这个类中,我使用List.addAll(Collection) 方法来设置内容。该列表现在可用于所有使用方法,即使在 Spring 编写之后也是如此。
    【解决方案2】:

    你可以使用 LazyInitTargetSource 除非在上下文初始化时必须在两个 bean 上调用方法

    http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/aop/target/LazyInitTargetSource.html

    (否则最好去掉循环依赖)

    【讨论】:

    • @Lazy 好像也挺不错的,但是豆子是在@Autowired 被注入之前处理的...
    猜你喜欢
    • 2018-01-01
    • 2014-02-11
    • 2019-11-11
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 2018-11-22
    相关资源
    最近更新 更多