Spring @Configuration中的Spring原型bean引用

时间:2015-04-24 04:47:09

标签: java xml spring spring-annotations

我浏览了以下页面,用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实例,它被定义为“原型”,这对我很好。

但是当返回一个FooRepository实例时,我看到使用相同的“foo”实例,虽然XML文件中的“foo”是“prototype”。

  1. 如何将Foo设置为FooRepository的新实例 是否创建了FooRepository?
  2. Foo的实例应来自XML文件。

2 个答案:

答案 0 :(得分:1)

您需要从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();
    }
}

方法2 :您可以参考此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));
    }
}

答案 1 :(得分:-1)

第一种方法:

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);
            }
}