我浏览了以下页面,用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”。
答案 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);
}
}