Bean作用域
Spring定义了四种作用域
1,单例Singleton 整个应用中这个bean只有一个实例
2,原型prototype 每次注入,或者使用应用上下文获取的时候,都会创建一个新的Bean
3,会话Session Web中,每一个会话创建一个实例
4,请求Request Web中,每一次请求创建一个实例
单例是一个默认的作用域。
要使用其他的作用域,使用@Scope注解,这个注解和@component以及@Bean注解一起使用,来决定定义的Bean的作用域
1,prorotype作用域
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
使用常量更加安全,或者直接@Scope(“prototype”)也是可以的。
使用xml配置:<bean id="" class="" scope=“prototype”/>
2,会话和请求作用域
在web中,我们希望针对某一个会话或者某一个请求指定一个新的实例,这里就会用到会话和请求作用域。
但是如果将一个会话/请求作用域的Bean注入到单例的作用域会存在问题。
对于单例作用域,会在Spring上下文加载的时候称将建,此时没有会话的话会话作用域不存在,无法注入,我们希望的是对于每个会话向单例作用域 bean注入不同的bean。这里需要使用代理。当真正调用代理的时候,代理会把方法分配给具体的会话作用域的bean实例、
@Scope(value =WebApplicationContext.SCOPE_SESSION,
proxyMode = ScopedProxyMode.INTERFACES)
如果代理的是类 proxyMode = ScopedProxyMode.TARGET_CLASS
<bean id=""
class=""
scope="session">
<aop:scope-proxy proxy-target-class=”false“/>
</bean>
xml配置,默认是class的,如果是接口,就加上proxy-target-class=“fasse”