首页 > 编程语言 > 详细

Spring学习之AOP

时间:2016-03-03 23:01:15      阅读:475      评论:0      收藏:0      [点我收藏+]

Spring-AOP(Aspect-orented programming)
在业务流程中插入与业务无关的逻辑,这样的逻辑称为Cross-cutting concerns,将Crossing-cutting concerns独立出来为一个对象,这样的特殊对象称为Aspect
Aspect,即方面。所谓方面,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹。

  方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的 Advisor或拦截器实现。

  通知(Advice): 在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。Spring中定义了四个advice: BeforeAdvice, AfterAdvice, ThrowAdvice和DynamicIntroductionAdvice

  切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点:例如,使用正则表达式。Spring定义了Pointcut接口,用来组合MethodMatcher和ClassFilter,可以通过名字很清楚的理解, MethodMatcher是用来检查目标类的方法是否可以被应用此通知,而ClassFilter是用来检查Pointcut是否应该应用到目标类上

 

实现方式:
  1.使用Spring API实现
  通知类型:前置通知、异常通知、后置通知、环绕通知、最终通知
  后置通知:

技术分享
 1 public class LogAfter implements AfterReturningAdvice{
 2                     /**
 3                      * 目标方法执行后执行的通知
 4                      * @param returnValue——返回值
 5                      * @param method 被调用方法对象
 6                      * @param args 被调用的方法的参数
 7                      * @param target 被调用的方法对象的目标对象
 8                      */
 9                     @Override
10                     public void afterReturning(Object returnValue, Method method, Object[] args,
11                             Object target) throws Throwable {
12                         System.out.println(target.getClass().getName()+"的"+method.getName()+"方法被执行——后");        
13                     }
14                 }
LogAfter.java

  前置通知:

技术分享
 1                 public class LogBefore implements MethodBeforeAdvice{
 2                     /**
 3                      * @param method 被调用方法对象
 4                      * @param args 被调用的方法的参数
 5                      * @param target 目标对象
 6                      */
 7                     @Override
 8                     public void before(Method method, Object[] args, Object target)
 9                             throws Throwable {
10                         System.out.println(target.getClass().getName()+"的"+method.getName()+"方法被执行——前");
11                     }
12                 }
LogBefore
技术分享
 1 <beans 
 2                     xmlns="http://www.springframework.org/schema/beans"
 3                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 4                     xmlns:aop="http://www.springframework.org/schema/aop"
 5                     xsi:schemaLocation=
 6                         "http://www.springframework.org/schema/beans 
 7                         http://www.springframework.org/schema/beans/spring-beans.xsd
 8                         http://www.springframework.org/schema/aop 
 9                         http://www.springframework.org/schema/aop/spring-aop.xsd">
10                     <!-- 声明一个切面 -->
11                     <bean id="logBefore" class="com.zhengbin.log.LogBefore" />
12                     <bean id="logAfter" class="com.zhengbin.log.LogAfter" />
13                     
14                     <bean id="userService" class="com.zhengbin.service.UserServiceImpl"/>
15                     <aop:config>
16                         <!-- pointcut切入点 -->
17                         <!-- execution(*[表示所有返回值] com.zhengbin.service[位置](..[表示所有参数])) -->
18                         <aop:pointcut id="pointcut" expression="execution(* com.zhengbin.service.*.*(..))" />
19                         <!--  -->
20                         <aop:advisor advice-ref="logAfter" pointcut-ref="pointcut"/>
21                         <aop:advisor advice-ref="logBefore" pointcut-ref="pointcut"/>
22                     </aop:config>
23                 </beans>
beans.xml

  2.自定义类实现

  3.通过注解实现

Spring学习之AOP

原文:http://www.cnblogs.com/zhengbin/p/5240341.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!