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".
- 如何将 Foo 始终设置为 FooRepository 的新实例
FooRepository 已创建?
- 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));
}
}
我浏览了下一页 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".
- 如何将 Foo 始终设置为 FooRepository 的新实例 FooRepository 已创建?
- 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));
}
}