Chinaunix首页 | 论坛 | 博客
  • 博客访问: 17488
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 211
  • 用 户 组: 普通用户
  • 注册时间: 2015-12-09 16:47
文章分类

全部博文(21)

文章存档

2017年(1)

2016年(9)

2015年(11)

我的朋友
最近访客

分类: Java

2015-12-24 14:14:16

AOP面向切面编程,与OOP是不同的两种概念,他们之间的关系并不是矛盾的,可以说是相铺相成的,OOP是从静态的形式上来考虑程序,而AOP是从动态,程序运行的时候进行改变程序的。Spring借鉴的是aspectJ的思想,谈到AOP有几个重要的概念是必须要提的。

切面(Aspect:业务流程中某个特定的步骤

连接点(JoinPoint:程序执行过程中明确的点,比如方法的调用,异常的抛出,spring AOP 中只是值方法的调用

增强处理(Advice:aop在特定的切入点执行的增强处理,一般有Around,before,after,afterReturning

切入点(pointcut:可以插入增强处理的连接点。

以下是通过注解方式生成的一些处理代码。

需要在spring的配置文件加入如下代码

<aop:aspectj-autoproxy/>

相关java代码

点击(此处)折叠或打开

  1. package test;

  2. import java.util.Arrays;

  3. import org.aspectj.lang.JoinPoint;
  4. import org.aspectj.lang.ProceedingJoinPoint;
  5. import org.aspectj.lang.annotation.After;
  6. import org.aspectj.lang.annotation.AfterReturning;
  7. import org.aspectj.lang.annotation.Around;
  8. import org.aspectj.lang.annotation.Before;

  9. public class AroundTest {
  10.     /**
  11.      * 定义环绕通知,其中excution 是关键词,test.*.*(..)代表着test包下的所有类的所有方法
  12.      * @param pr
  13.      * @return
  14.      * @throws Throwable
  15.      */
  16.     @Around("execution(* test.*.*(..))")
  17.     public Object around(ProceedingJoinPoint pr) throws Throwable{
  18.         System.out.printf("excute method before");
  19.         Object rvt = pr.proceed(new String[]{"被改变的命运"});
  20.         System.out.printf("excute method after");
  21.         return rvt+"新增的内容";
  22.         
  23.     }
  24.     /**
  25.      * Object [] getArgs();返回执行目标时的参数
  26.      * Signature getSignature():返回被增强的方法的相关信息
  27.      * Object getTarget();返回被植入增强处理的目标对象
  28.      * Object getThis();返回AOp框架为目标对象生成的代理对象
  29.      * @param jp
  30.      * @return
  31.      */
  32.     @Before("execution(* test.*.*(..))")
  33.     public void before(JoinPoint jp){
  34.         System.out.println("Before增强:模拟执行全线检查");
  35.         System.out.println("Before增强:被植入增强目标的方法为:"
  36.                 +jp.getSignature().getName()
  37.                 );
  38.         System.out.println("Before增强:目标方法的参数为:"+Arrays.toString(jp.getArgs()));
  39.         
  40.     }
  41.     @AfterReturning(pointcut="excution(* test.*.*(..))",returning="ob")
  42.     public void afterReturn(JoinPoint jp,Object ob){
  43.         
  44.         System.out.println("AfterReturnning增强:获取目标方法返回值"+ob);
  45.         System.out.println("AterReturnning增强:模拟记日志功能"
  46.                 +jp.getSignature().getName()
  47.                 );
  48.         System.out.println("Before增强:目标方法的参数为:"+Arrays.toString(jp.getArgs()));
  49.     }
  50.     @After("execution(* test.*.*(..))")
  51.     public void after(JoinPoint jp){
  52.         
  53.         System.out.println("After增强:获取目标方法返回值");
  54.         System.out.println("Ater增强:模拟释放资源"
  55.                 +jp.getSignature().getName()
  56.                 );
  57.         
  58.     }
  59.     
  60. }


运行过程可以看到around先执行,然后调用before执行,紧接着around执行,再然后afterReturnning,最后执行after。同样也可以采用配置文件来进行管理。在配置文件中定义切点的时候都必须在 《config>

点击(此处)折叠或打开

  1. <aop:config>
  2.            
  3.    </aop:config>标签内配置
  4.   <aop:config>
  5.                <!-- 定义一个切面类 -->
  6.            <aop:aspect id="afterForAspect" ref="afterAspcet">
  7.                <!-- 配置增强处理的时候 其中 pointcut置顶切入的表达式,pointcut-ref指定一个已经定义好的切入点
  8.                method 指定 切入的方法的名称,throwing该属性只对<aop:throwing/>有效,returning只对
  9.                <aop:after-returning/>有效
  10.                -->
  11.                <aop:before pointcut="execution(* test.HibernateTest.test(..))" method="before"/>
  12.                <aop:after pointcut="execution(* test.HibernateTest.test(..))" method="after" />
  13.            <!--     <aop:around method="around" pointcut="execution(* test.HibernateTest.test(..))"/> -->
  14.                <aop:after-returning method="afterReturn" pointcut="execution(* test.HibernateTest.test(..))" returning="ob"/>
  15.            </aop:aspect>
  16.    </aop:config>


阅读(1276) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~