Spring Scope
Scope类型
1.singleton
每次从容器获取bean,每次获取的都是同一个对象,
spring容器创建时他就开始 spring 容器关闭,他就会关闭。
2.prototype
每次从容器获取bean,都是获取一个新的对象
每次使用的时候bean会创建, 自行调用每个多列的销毁方法才会销毁
3.request
bean存在request bean中,生命周期也是和request域一样的
请求来了把bean放到request中,请求结束了bean也就结束了
4.session
会话开始bean开始,会话结束bean结束
3.application
应用程序启动bean创建,应用程序销毁 bean销毁(应用程序说的 web中的serverletcontext)
Scope失效
1.单列依赖(singleton)注入多bean prototype失效
@Component
public class Bean1 {
@Autowired
private Bean2 bean2;
public Bean1() {
}
public void setBean2(Bean2 bean2) {
this.bean2 = bean2;
}
}
@Scope("prototype")
@Component
public class Bean2 {
}
输出:
com.dazuizui.com.cycle.F@6633fc54
com.dazuizui.com.cycle.F@6633fc54
我们发现打印出来是哦同一个对象,
因为对于单列对象来说,依赖注入仅发生了一次,后续没有再用刀多列的F,因此Bean2用的始终是的一次依赖注入的结果
解决方案
这些解决方法都是推迟scope bean的获取
使用@lazy生成代理
@Lazy
@Autowired
private Bean2 bean2;
在Bean2上面添加ProxyMode
@Scope(value = "prototype",proxyMode = ScopedProxyMode.TARGET_CLASS)
@Component
public class Bean2
Object工厂解决单列注入多列
@Autowired
private ObjectFactory<Bean2> bean2;
public Bean2 getBean2() {
return bean2.getObject();
}
通过容器去解决
@Autowired
private ApplicationContext context;
public Bean2 getben2(){
return (Bean2) context.getBean("bean2");
}