Spring问题2

Spring AOP和Aspectj的区别
  • Spring AOP采用动态代理的方式,在运行期生成代理类来实现AOP,不修改原类的实现;
  • Aspectj使用编译期字节码织入(weave)的方式,在编译的时候,直接修改类的字节码,把所定义的切面代码逻辑插入到目标类中
  • Spring aop可以对其它模块正常编译出的代码起作用,Aspectj需要对其他模块使用acj重新编译
  • Spring aop对于直接调用类内部的其他方法无效(需要获取对应的代理类来调用),无法对定义为final的类生效(因为无法支撑代理类,导致运行时异常)。Aspectj没有这些限制
  • Spring aop使用xml配置文件的方式定义切入点,Aspectj使用注解方式

Spring AOP的代理类如何实现的
  • Spring aop使用JDK proxy或者cglib实现代理类生成;
  • 对于有实现接口的类使用JDK proxy;
  • 对于无接口的则是用cglib
  • <aop:aspectj-autoproxy proxy-target-class="true">指定proxy-target-class为true可强制使用cglib

JDK Proxy和cglib区别
  • JDK Proxy只适用于类实现了接口的情况,生成的代理类实现了原类的接口,但和原类没有继承关系。
    • Interface-->OriginClass-->ProxyClass
  • cglib则是生成原来的子类,对于没有实现接口的情况也适合;
    • OriginClass-->ProxyClass
  • cglib采用字节码生成的方式来在代理类中调用原类方法,JDK proxy则是使用反射调用,由于反射存在额外security check的开销,性能较弱

Spring事务管理

Spring的事务管理机制实现的原理,就是通过一个动态代理对所有需要事务管理的Bean进行加载,并根据配置在invoke方法中对当前调用的 方法名进行判定,并在method.invoke方法前后为其加上合适的事务管理代码,这样就实现了Spring式的事务管理。Spring中的AOP实 现更为复杂和灵活,不过基本原理是一致的。

Spring Bean作用域
  • singleton:在每个Spring IoC容器中一个bean定义对应一个对象实例。
  • prototype:一个bean定义对应多个对象实例。
  • request:在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext 情形下有效。
  • session:在一个HTTP Session 中,一个bean定义对应一个实例。该作用域仅在基于web的SpringApplicationContext 情形下有效。
  • global session:在一个全局的HTTP Session 中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的Spring ApplicationContext 情形下有效。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值