注释字段/构造函数仅提供该类的一个实例,即使该bean被配置为原型。但我想在循环中为特定类创建新实例。
以下是我的Component类:
@Component
class Link{
@Autowired
private RandomClass rcobj;
public void getFiveInstancesOfRandomClass(){
//here I want to create five new instances for RandomClass but I get only one by auto-wiring
}
}
Config.class
@Configuration
class ApplicationConfig{
@Bean
public Link link(){ return new Link();}
@Bean
@scope ("prototype")
public RandomClass randomClass(){ return new RandomClass();}
}
我查看了一些主要使用基于xml的配置的示例。其中一个解决方案是调用ApplicationContext,但我想用lookup-method解决这个问题。
答案 0 :(得分:3)
通过java配置将原型注入单例我使用以下技术:
Singleton类:
public abstract class Single
{
abstract Proto newInstance();
public void useBean()
{
System.out.println( newInstance() );
}
}
原型类:
public class Proto
{
}
上下文:
public class Context
{
@Bean
public Single single()
{
return new Single() {
@Override
Proto newInstance()
{
return proto();
}
};
}
@Bean
@Scope("prototype")
public Proto proto()
{
return new Proto();
}
}
测试类:
public static void main( String[] args )
{
ApplicationContext context = new AnnotationConfigApplicationContext( Context.class );
Single single = context.getBean( Single.class );
single.useBean();
single.useBean();
}
从输出中我们可以看到每个调用使用不同的对象:
test.Proto@b51256
test.Proto@1906517
P.S。 我完全同意你的意见,我们不应该用applicationContext绑定bean。它创造了额外的耦合,我相信这不是一个好习惯。