Spring学习笔记——Bean的作用域
1:种类
singleton:单例,不指定时bean默认均为单例,例如SpringMVC的前端控制器(DispatcherServlet)
prototype:原型,每次注入或获取bean时都会创建一个新的bean实例,例如Struts2的Action
session:会话。特指web应用。为每个会话(session)创建一个bean
request:请求。特指web应用。为每个请求(request)创建一个bean
2:设置作用域
(1)xml文件中通过bean的scope属性设置
(2)如果Bean是通过JavaConfig类进行配置,在方法上和@Bean一起使用@Scope(XX)注解即可
(3)通过和@Component一起使用@Scope,用于指明该Bean的作用域
后两种方式的参数可以直接使用小写字符串声明。
3:session和request作用域下的代理模式:ScopedProxyMode
最常使用的例子:在电商平台中为每个session生成一个购物车的Bean,或者为每个request生成一个Bean。
如果使用默认的singleton,则所有用户均使用一个唯一的购物车。如果声明为prototype,在需要该bean的地方就会生成新的购物车bean,都不符合实际需求。
由于声明为session和request作用域的bean需要在request和session存在时才会被创建,且数量不定,所以引入了代理模式。
在需要使用到该bean的地方首先会注入一个bean代理,在实际运行时通过懒加载决定实际注入的bean
通过注解扫描获得Bean:
session和request作用域:在通过Component注解声明bean时需要额外添加scope注解。该注解内指定proxyMode(代理模式,值来自于ScopedProxyMode的常量):
proxyMode=ScopedProxyMode.XX
INTERFACES:表明声明的Bean需要被注入到一个接口,即需要一个接口作为代理,
TARGET_CLASS:表明Bean是个class,这是最理想的代理模式
通过xml配置时:
Bean的子标签<aop:scoped-proxy>,该标签的proxy-target-class属性设置为false时表明代理的是接口
注意:需要在xml中声明Spring的AOP命名空间
个人使用的文件头见:
https://www.cnblogs.com/ForsakenCoder/p/9624113.html