美文网首页
Scoped beans

Scoped beans

作者: cdz620 | 来源:发表于2020-03-03 00:27 被阅读0次

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

image.png
  • 场景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 在实现上几乎无关。

相关文章

网友评论

      本文标题:Scoped beans

      本文链接:https://www.haomeiwen.com/subject/gcrjchtx.html