首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring @配置中的Spring原型bean引用

Spring @配置中的Spring原型bean引用
EN

Stack Overflow用户
提问于 2015-04-24 04:47:09
回答 2查看 1.1K关注 0票数 1

我浏览了下面的页面,用Java引导一个applicationContext.xml。

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

我的applicationContext有如下内容:

代码语言:javascript
运行
复制
<beans>
    <bean id="foo" class="com.mypackage.Foo" scope="prototype">       
    </bean>
</beans>

我需要引用Java中的"foo“,如下所示:

代码语言:javascript
运行
复制
@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的引用如下:

代码语言:javascript
运行
复制
ApplicationContext ctx = 
                   new AnnotationConfigApplicationContext(Config.class);

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

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

但是,当返回FooRepository实例时,我看到使用的是"foo“实例,但是XML文件中的"foo”是"prototype“。

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-24 05:05:11

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

代码语言:javascript
运行
复制
@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

代码语言:javascript
运行
复制
@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
EN

Stack Overflow用户

发布于 2015-04-24 05:00:13

第一方法:

Foo也应该是一个原型。

第二种方法:

代码语言:javascript
运行
复制
@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);
            }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29838921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档