@Scope

发布时间 2023-05-29 15:02:39作者: 谭五月

1、在单例中注入多例 @Scope 失效

由于@Autowired自动注入在一个对象中只发生一次,导致单例bean中的多例变量,在单例的生命周期中都是同一个实例,故多例设置失效。
有以下方式可以解决:

  • 使用@Lazy生成代理:将@Lazy注解添加到注入的变量上,代理对象虽然还是同一个,但当每次使用代理对象的任意方法时,由代理对象创建新的目标对象
@Lazy
@Autowired
private Class_1 instance;
  • 在目标类上添加注解属性proxyMode,生成代理
@Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Class_1{
}
  • 注入一个目标对象的对象工厂,每次都由对象工厂创建新的实例
@Autowired
private ObjectFactory<Class_1> instance;
//
public Class_1 getInstance(){
	return instance.getObject();
}
  • 使用ApplicationContext获取多例对象
@Autowired
private ApplicationContext context;
//
public Class_1 getInstance(){
	context.getBean(Class_1.class);
}