在spring中 如果需要一个对象为多例,需要使用
@Scope
注解,指明作用于为
SCOPE_PROTOTYPE
即可。
当我们在一个单例的bean A中注入多例bean B时,由于spring在初始化过程中加载A的时候已经将B注入到A中,所以直接当做成员变量时,只会获取一个实例。我们可以通过以下两种优雅的方法解决:
1 使用Lookup注解
我们可以使用Spring的 @Lookup
注解。该注解主要为单例bean 实现一个cglib代理类,并通过BeanFacoty.getBean() 来获取对象。
2 使用Spring的ObjectFactory
如果原始使用方式如下:
@Component
public class SingleBean {
@Autowired
PrototypeBean prototypeBean;
public void print(String name) {
System.out.println("single service is " + this);
prototypeBean.test(name);
}
}
只需要用ObjectFactory
封装以下即可,使用时 调用ObjectFactory.getObject()
即可
@Component
public class SingleBean {
@Autowired
ObjectFactory<PrototypeBean> factory;
public void print(String name) {
System.out.println("single service is " + this);
factory.getObject().test(name);
}
}
测试代码链接:
lookup注解使用
objectFactory使用