武汉最近突然就变冷了,我也坐在冷冷的公司敲着代码,这让我非常怀恋在以前公司开着暖气coding的日子。现在公司为撒不开暖气呢?肯定是电费太贵,这样只能苦了我们。要是能少交电费就好了。想想我们平时是怎么叫电费的:抄表员或者电子记录表通过电表定时的记录我们每个月使用的电量,然后根据每°电的价格得出我们的电费。试想如果没有电表该怎么办呢?或许我们每个家庭可以自己估算自己的用电量,或者凭良心记录,这样交电费多好啊。(不过电力公司可能就破产了)想一想这个例子,家里只要有电器使用,电表就回走表,而且当你使用电器的时候似乎根本不知道电表的存在。此时的电表多么像一个通知(advice),而电器用电就是一个切点(cutpoint),而组合起来就是一个切面(aspect)了。
其实面向切面就是这么的简单,它可能就在你的身边。那么现在就讲讲面向切面的基本术语:
横切关注点:分布于应用中多处的功能;
切面:横切关注点可以被模块化为特殊的类,这些类被称为切面;
通知(advice):定义切面是什么以及何时使用;(5中类型)
1.Before---在方法被调用之前调用通知;
2.After-----在方法完成之后调用通知,无论方法是否执行成功;
3.After-returning---在方法成功执行之后调用通知;
4.After-throwing----在方法抛出异常后调用通知;
5.Around----通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为;
连接点(Joinpoint):在应用执行过程中能够插入切面的一个点。
切点(Pointcut):通知起作用的连接点。
切面(Aspect):切点和通知的结合。(通知定义了何时,做什么;切点定义了何处)
引入(Introduction):引入允许我们向现有的类添加新方法或属性;
织入(weaving):织入是将切面应用到目标对象来创建新的代理对象的过程。
编译期:切面在目标类编译时织入。这种方法需要特殊的编译期。(AspectJ的织入编译期就是以这种方式织入切面的)
类加载期:切面在目标类加载到JVM时被织入。这种方式需啊哟特殊的类加载器,它可以在目标类被引用之前增强目标类的字节码。
运行期:切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态地创建一个代理对象。Spring AOP就是以这种方式织入切面的
Spring提供了4种各具特色的AOP支持:
- 基于代理的经典AOP
- @AspectJ注解驱动的切面
- 纯POJO切面
- 注入式AspectJ切面
前三种都是spring基于代理的AOP变体,Spring对AOP的支持局限于方法拦截。如果AOP需求超过了简单方法拦截的范畴(比如构造器或属性拦截),那么应该考虑在AspectJ里实现切面,里哦用Spring的DI把Spring Bean注入到AspectJ切面中。
Spring在运行期通知对象,只支持方法连接点。
下面是一个简单的例子:
<bean id="advice" class="com.maxvison.springStudy.aspect.MyAdvice" /> <bean id="perform" class="com.maxvison.springStudy.beans.Performer" /> <aop:config> <aop:aspect ref="advice"> <aop:after-returning method="haveShow" pointcut-ref="myadvice"/> <aop:after method="afterShow" pointcut-ref="myadvice"/> <aop:before method="beforeShow" pointcut-ref="myadvice"/> <aop:pointcut expression="execution(* com.maxvison.springStudy.beans.Performer.show(..))" id="myadvice"/> </aop:aspect> </aop:config>
Spring的AOP配置元素:
<aop:config> 顶层的AOP配置元素,大多数的<aop:*>元素必须包含在<aop:config>元素内 <aop:aspect> 定义切面 <aop:before> 定义前置通知 <aop:after> 定义后置通知 <aop:after-returning> 定义AOP after-returning通知 <aop:after-throwing> 定义AOP after-throwing通知 <aop:around> 定义AOP around通知 <aop:pointcut> 定义切点 <aop:advisor> 定义AOP通知器 <aop:aspectj-autoproxy> 启用@AspectJ注解驱动的切面 <aop:declare-parents> 为被通知的对象引入额外的接口,并透明地实现
在定义切点时,Spring借助AspectJ的切点表达式语言来定义Spring切面。
详细内容可参考:http://blog.csdn.net/bzhang19841212/article/details/2647582