我通过以下页面在 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”。
- 如何将 Foo 始终设置为 FooRepository 的新实例 FooRepository 已创建?
- Foo 的实例应来自 XML 文件。
最佳答案
您需要从 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));
}
}
关于java - Spring @Configuration 中的 Spring 原型(prototype) bean 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29838921/