社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 社区论坛任务 迷你宠物
  • 5888阅读
  • 0回复

[JAVA]Spring AOP 学习小结

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、AOP 概念 miQ*enZi  
Joinpoint:它定义在哪里加入你的逻辑功能,对于Spring AOP,Jointpoint指的就是Method。 ~,1Sw7 rE  
R`a~8QVh&5  
Advice:特定的Jointpoint处运行的代码,对于Spring AOP 来讲,有Before advice、AfterreturningAdvice、ThrowAdvice、AroundAdvice(MethodInteceptor)等。 ([< HFc`  
$B%KkD  
Pointcut:一组Joinpoint,就是说一个Advice可能在多个地方织入, Ta?}n^V?;  
N2A6C$s  
Aspect:这个我一直迷惑,它实际是Advice和Pointcut的组合,但是Spring AOP 中的Advisor也是这样一个东西,但是Spring中为什么叫Advisor而不叫做Aspect。 '0q$qN  
;;+AdN5  
Weaving:将Aspect加入到程序代码的过程,对于Spring AOP,由ProxyFactory或者ProxyFactoryBean负责织入动作。 Nv36#^Z  
iD_y@+iz  
Target:这个很容易理解,就是需要Aspect功能的对象。 KU` *LB:  
T&]-p:mg^  
Introduction:引入,就是向对象中加入新的属性或方法,一般是一个实例一个引用对象。当然如果不引入属性或者引入的属性做了线程安全性处理或者只读属性,则一个Class一个引用也是可以的(自己理解)。Per-class lifecycle or per-instance life cycle |JYb4J4Ni  
QWfSm^ t  
二、AOP 种类 {P~rf&Ee  
1、静态织入:指在编译时期就织入Aspect代码,AspectJ好像是这样做的。 d8jH?P-"  
naf ~#==vc  
2、动态织入:在运行时期织入,Spring AOP属于动态织入,动态织入又分静动两种,静则指织入过程只在第一次调用时执行;动则指根据代码动态运行的中间状态来决定如何操作,每次调用Target的时候都执行(性能较差)。 ySO\9#Ho  
9c)#j&2?H  
三、Spring AOP 代理原理 ;n(f?RO3X  
Spring AOP 是使用代理来完成的,Spring 会使用下面两种方式的其中一种来创建代理: A<)n H=G&  
1、JDK动态代理,特点只能代理接口,性能相对较差,需要设定一组代理接口。 <.4(#Ebd  
2、CGLIB 代理,可代理接口和类(final method除外),性能较高(生成字节码)。 /CsP@f_Gw  
7<WS@-2I#  
~CnnN[g(_  
四、Spring AOP 通知类型 %mT/y%&:  
1、BeforeAdvice:前置通知需实现MethodBeforeAdvice,但是该接口的Parent是BeforeAdvice,致于什么用处我想可能是扩展性需求的设计吧。或者Spring未来也并不局限于Method的JoinPoint(胡乱猜测)。BeforeAdvice可以修改目标的参数,也可以通过抛出异常来阻止目标运行。 <L qJg  
BK%B[f*[OA  
2、AfterreturningAdvice:实现AfterreturningAdvice,我们无法修改方法的返回值,但是可以通过抛出异常阻止方法运行。 Dbn344s  
ye$_=KARP  
3、AroundAdvice:Spring 通过实现MethodInterceptor(aopalliance)来实现包围通知,最大特点是可以修改返回值,当然它在方法前后都加入了自己的逻辑代码,因此功能异常强大。通过MethodInvocation.proceed()来调用目标方法(甚至可以不调用)。 kpn|C 9r  
9Tt%~m^  
4、ThrowsAdvice:通过实现若干afterThrowing()来实现。 [h;I)ug[o(  
\~%+)a%%  
5、IntroductionInterceptor:Spring 的默认实现为DelegatingIntroductionInterceptor wX]$xZ!s  
gU x}vE-  
五、Spring AOP Pointcut g-d{"ZXd J  
以上只是Advice,如果不指定切入点,Spring 则使用所有可能的Jointpoint进行织入(当然如果你在Advice中进行方法检查除外)。因此切入点在AOP中扮演一个十分重要的角色。Spring 2.0 推荐使用AspectJ的Annocation的切入点表达式来定义切入点,或者使用<aop:xxx/>来定义AOP,这方面本篇不做考虑。 63u%=-T%a  
aH_c84DS  
1、Pointcut:它是Spring AOP Pointcut的核心,定义了getClassFilter()和getMethodMatcher()两个方法。 lY tt|J  
G'/G DN^j  
2、ClassFilter:定义了matches(Class cls)一个方法。 +M I{B="7.  
4DCh+|r  
3、MethodMatcher() 定义了matches(Method,Class),isRuntime(),matches(Mathod,Class,Object[])三个方法,如果isRuntime()返回true则表示为动态代理(实际是动态代理的动态代理),则调用第三个方法(每访问一次调用一次),否则调用第一个方法(并且只调用一次) _< .VP  
8~C}0H  
4、Spring AOP 静态切入点的几个实现。 `3T=z{HR9g  
ComposablePointcut 太复杂一个切入点无法表达就用这个,union MethodMatcher和ClassFilter或者intersection MethodMatcher、ClassFilter和Pointcut。为什么不实现union Pointcut? 而只能通过Pointcuts类对Pointcut进行union操作。 *GE6zGdN  
}UW*[dCf>C  
ControlFlowPointcut 想对程序的运行过程进行追踪就用这个 ! s =$UC  
gE\ ^ vaB  
DynamicMatchMatcherPointcut 想用动态AOP 就用这个 '1b 1N5~  
C][hH?.  
JdkRegexpMethodPointcut 想使用正则表达式就用这个 L4/ns@e  
bOr11?  
Perl5RegexpMethodPointcut a`w=0]1&*  
>E J{ *  
NameMatchMethodPointcut 想用方法名字来匹配就用这个 a pa&'%7  
:Pdh##k  
StaticMethodMatcherPointcut 静态切入点就用这个 I8J>>H'#A  
没有人反对你直接实现Pointcut:)。 2w7$"N  
3O$l;|SX  
六、Spring AOP 中的Advisor其实就是Aspect `Uz.9_6  
1、 PointcutAdvisor wz:e\ !  
其实一般使用DefaultPointcutAdvisor就足够了,给它Advice和Pointcut。 d5gwc5X  
当然如果想少写那么几行代码也可以使用NameMatchMethodPointcutAdvisor,RegexpMethodPointcutAdvisor等。 NzQvciJ@"  
更多Advisor可以查看API文档。 [y`G p#  
EZB0qZIp  
-6- sI  
2、 IntroductionAdvisor '69)m~B0a  
默认实现为DefaultIntroductionAdvisor。 .2JZ7  
}NC$Ce  
七、AOP ProxyFactory ESV./~K  
使用代码实现AOP 可使用ProxyFactory n?r8ZDJ'  
声明式AOP 可使用ProxyFactoryBean pwfQqPC#_  
ProxyFactoryBean 需要设定 target,interceptorNames(可以是Advice或者Advisor,注意顺序) }5vKQf   
对接口代理需设置proxyInterfaces *J[ P#y  
vm+3!s:u  
八、自动代理 Z. gb'  
BeanNameAutoProxyCreator EWDsBNZaI  
  1. <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
  2.     <property name="beanNames"><value>jdk*,onlyJdk</value></property> 
  3.     <property name="interceptorNames"> 
  4.         <list> 
  5.             <value>myInterceptor</value> 
  6.         </list> 
  7.     </property> 
  8. </bean> 
)?[7}(4jI  
DefaultAdvisorAutoProxyCreator c2g[w;0"  
  1. <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/> 
  2. <bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor"> 
  3.     <property name="transactionInterceptor" ref="transactionInterceptor"/> 
  4. </bean> 
  5. <bean id="customAdvisor" class="com.mycompany.MyAdvisor"/> 
  6. <bean id="businessObject1" class="com.mycompany.BusinessObject1"> 
  7.     <!-- Properties omitted --> 
  8. </bean> 
  9. <bean id="businessObject2" class="com.mycompany.BusinessObject2"/> 
|(%<FY$  
t^":.}[Q  
D|ze0A@  
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

您目前还是游客,请 登录注册
欢迎提供真实交流,考虑发帖者的感受
认证码:
验证问题:
10+5=?,请输入中文答案:十五