Scoped beans
2020-03-03 本文已影响0人
cdz620
docs
Scoped beans
bean的作用范围
- Singleton:真个应用生存周期内单例,默认的scope
- Prototype:每次对该bean请求时都会创建新的一个bean
- Session: web application 每个session创建一个bean
- Request: web application 每个请求创建一个bean
配置
JavaConfig
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public Notepad notepad() {
return new Notepad();
}
xml
<bean id="notepad"
class="com.myapp.Notepad"
scope="prototype" />
scope proxy

- 场景1:session-scope bean必须等到触发session时才会创建bean,当单例bean需要注入session-scope bean时就必须用到scope proxy
- 场景2:request-scope bean也会以懒加载的形式注入到session-scope bean中
- 原理:
- 懒加载
- 代理模式调用,将方法调用转移到代理
配置scoped proxies
JavaConfig
@Component
@Scope(
value=WebApplicationContext.SCOPE_SESSION,
proxyMode=ScopedProxyMode.INTERFACES)
public ShoppingCart cart() { ... }
xml
<bean id="cart"
class="com.myapp.ShoppingCart"
scope="session">
<aop:scoped-proxy proxy-target-class="false" />
</bean>
- aop:scoped-proxy 当scope为session时,需要设置这个,告诉spring不是直接di注入,而是个AOP 代理,需要被注入。proxy-target-class=”false” 告诉spring使用jdk 动态代理
The <aop:scoped-proxy /> element tells Spring that this bean is not to be injected as a dependency directly, but instead an AOP proxy of this bean is to be injected in its place. The proxy-target-class=”false” attribute tells Spring not to use a CGLIB proxy, but a JDK dynamic proxy instead.
CGLIB
CGLIB(Code Generation Library)它是一个代码生成类库。它可以在运行时候动态是生成某个类的子类。代理模式为要访问的目标对象提供了一种途径,当访问对象时,它引入了一个间接的层。JDK自从1.3版本开始,就引入了动态代理,并且经常被用来动态地创建代理。JDK的动态代理用起来非常简单,唯一限制便是使用动态代理的对象必须实现一个或多个接口。而CGLIB缺不必有此限制。要想Spring AOP 通过CGLIB生成代理,只需要在Spring 的配置文件引入
<aop:aspectj-autoproxy proxy-target-class="true"/>
CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM(Java字节码操控框架),来转换字节码并生成新的类。由于没有了解过class 文件和字节码,因而也就写不下去了。
也许学习下来最大的收获便是 弄清楚了 AspectJ 和 Spring AOP 在实现上几乎无关。