Spring Spring @Configuration 中的原型 bean 引用

Spring prototype bean reference in Spring @Configuration

我浏览了下一页 bootstrap Java 中的 applicationContext.xml。

http://docs.spring.io/spring-javaconfig/docs/1.0.0.M4/reference/html/ch06.html

我的 applicationContext 有类似的东西:

<beans>
    <bean id="foo" class="com.mypackage.Foo" scope="prototype">       
    </bean>
</beans>

我需要参考Java中的"foo"如下:

@Configuration
@AnnotationDrivenConfig 
@ImportXml("classpath:applicationContext.xml")
public class Config {

    @Autowired Foo foo;

    @Bean(name="fooRepository")
    @Scope("prototype")
    public FooRepository fooRepository() {
        return new JdbcFooRepository(foo);
    }


}

我正在创建 FooRepository 的引用,如下所示:

ApplicationContext ctx = 
                   new AnnotationConfigApplicationContext(Config.class);

FooRepository fr = ctx.getBean("fooRepository", FooRepository.class);

每次我调用它时,我都会得到一个新的 FooRepository 实例,它被定义为 "prototype",这对我来说很好。

但是当返回 FooRepository 的实例时,我看到使用了相同的 "foo" 实例,尽管 XML 文件中的 "foo" 是 "prototype".

  1. 如何将 Foo 始终设置为 FooRepository 的新实例 FooRepository 已创建?
  2. Foo 的实例应该来自 XML 文件。

第一种方法:

Foo 也应该是一个原型。

第二种方法:

@Configuration 
@AnnotationDrivenConfig 
@ImportXml("classpath:applicationContext.xml") 
public class Config {

            @Bean(name = "fooRepository")
            @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
            public FooRepository fooRepository(Foo foo) {
                return new JdbcFooRepository(foo);
            }
}

您需要从 xml 中删除条目 Foo。你可以这样定义它。

@Configuration
@AnnotationDrivenConfig
@ImportXml("classpath:applicationContext.xml")
public class Config {

    @Bean(name = "fooRepository")
    @Scope("prototype")
    public FooRepository fooRepository() {
        return new JdbcFooRepository(foo());
    }

    @Bean(name = "foo")
    @Scope("prototype")
    public Foo foo() {
        return new foo();
    }
}

方法二:可以参考这个SO Answer.

@Configuration
@AnnotationDrivenConfig
@ImportXml("classpath:applicationContext.xml")
public class Config {

    @Autowired
    private ApplicationContext context;

    @Bean(name = "fooRepository")
    @Scope("prototype")
    public FooRepository fooRepository() {
        return new JdbcFooRepository(context.getBean("foo", Foo.class));
    }
}