博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AspectJ AOP实现
阅读量:4220 次
发布时间:2019-05-26

本文共 3718 字,大约阅读时间需要 12 分钟。

Spring AspectJ方式提供了在代码中进行AOP的方式,宜于集中化管理PointCut,不用再写好代码后,在xml中配置一大串。

AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件.

AspectJ语法

通配符

*  表示任何数量的字符,除了.

.. 表示任何数量的字符包括任何数量的.
+  描述指定类型的任何子类或者子接口   
!  排除
||和&& 或,与

例:

java.*.Date     类型Date在任何直接的java子包中,如ava.util.Date和java.sql.Date
javax..*Model+  所有javax包或者子包中以Model结尾的类型和其所有子类,如TableModel,TreeModel。
!vector                             所有除了Vector的类型
Vector|| Hashtable              Vector或者Hashtable类型
!public static * banking..*.*
所有的非public static 属性,在banking的包或者子包中
一,注解实现方式:

1,实现类

package com.lvjian.aop;

import java.util.Date;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

@Aspect    //指定下面的类为Aspect

public class Log {
Date date = new Date();
@Before(“execution( * *.update(..))”)         //任意类有update方法执行前执行logUpdate方法
                    //@Before(“execution( * *.update(..))”)  前一个* 为update的返回类型,后一个 * 为类的名称
public void logUpdate(){
System.out.println( “begin update at ” + date.getTime() );
}

}

2,在applicationContext.xml像配置普通bean一样配置此类

<bean id=”logAspect”
</bean>

注:1,要在applicationContext.xml 加入对AspectJ的支持

<bean />
或<aop:aspectj-autoproxy/>

2, 注解有:

(1)Pointcut 当@Before(“execution( * *.update(..))”)  多时,execution就会类同,这是切面,可定义一切面Pointcut解决。
     @Pointcut(“execution( * *.update(..))”)
        public void pc(){   
            System.out.println( “@Pointcut!!! “);  
      }

     @Before(value=”pc()”)

       public void logChange(){
           System.out.println( “change!!! ” + date.getTime() );
}
(2)传统aop 增强类型有MethodBeforeAdvice,AfterReturningAdvice,MethodInterceptor,ThrowsAdvice等接口,对应的注解为:MethodBeforeAdvice  ——  @Before
        AfterReturningAdvice  ——  @AfterReturning
        MethodInterceptor      ——  @Around
        ThrowsAdvice            ——  @AfterThrowing
                                                @After :无论方法以何种方式结束,都会执行(类似于finally)
       
 应用:
    
import java.util.Date;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect

public class Log {
Date date = new Date();
@Before(“execution( * *.update(..))”)
public void logUpdate(){
System.out.println( “begin update at ” + date.getTime() );
}

@Pointcut(“execution( * *.update(..))”)

public void pc(){   
System.out.println( “@Pointcut!!! “);

}

@Before(value=”pc()”)

public void logChange(){
System.out.println( “before change!!! “  );
}

@AfterReturning(value=”pc()”)

public void AfterlogChange(){
System.out.println( “after!!! “  );
}

@Around(value=”pc()”)

public Object AroundlogChange( ProceedingJoinPoint point ) throws Throwable{
System.out.println( “around before “  );
Object re = point.proceed();
System.out.println( “around after “  );
return re;
}

@After(value=”pc()”)

public void AfterlogChange() {
System.out.println( “After —— finally “  );
}
}
(3)注解对监听方法的操作:
1) 在形参中定义org.aspectj.lang.JoinPoint类型的参数,用些来访问方法。(注:@Around 用的是是ProceedingJoinPoint,它是org.aspectj.lang.JoinPoint的一个子类)
   
    JoinPoint 方法有:
      getArgs() :   返回方法形参
      getThis() :   返回代理对象
      getTarget() :返回目标
      getSignature() :返回正在被通知的方法相关信息
      toString() : 打印出正在被通知的方法的有用信息
@Before(value=”pc()”)
public void logChange( JoinPoint jp ){

System.out.println( “toString  ” + jp.toString()  );

}

2) 获取方法的参数

  getArgs() :   返回方法形参
  @AfterReturning(“execution( * *.admin(..))&&args(userName,..)”)   //args与类平行
  public void AfterReturninglogAdmin( String userName ){
      System.out.println( “after admin !!! ” + userName );
}
二,XML配置实现方式:
1, 修改xml的头部,让其支持aop命名空间。
<beans
xmlns=””
xmlns:xsi=””
xmlns:aop=””
xsi:schemaLocation=”
               
                “>

2,在XML中配置:

<aop:config>

<aop:aspect id=”log” ref=”logXML”>

<aop:pointcut id=”update” expression=”execution( * *.XMLBefore())” />
<aop:before pointcut-ref=”update”  method=”logUpdate” />
</aop:aspect>

</aop:config>

注: 要去掉用传统方式实现的自动代理AutoProxyCreator 如:

<bean id=”autoPghroxyCreator” >
</bean>

转载地址:http://lclmi.baihongyu.com/

你可能感兴趣的文章
栈与队列的应用——计算表达式的值
查看>>
静态链表——sharing
查看>>
静态链表——sorting
查看>>
DFS——背包问题
查看>>
DFS——选数问题
查看>>
BFS——求矩阵中“块”的个数
查看>>
BFS——走迷宫的最小步数
查看>>
并查集——好朋友
查看>>
关键路径
查看>>
Web前端学习笔记——JavaScript之事件详解
查看>>
Web前端学习笔记——JavaScript之事件、创建元素、节点操作
查看>>
Web前端学习笔记——JavaScript之正则表达式、伪数组、垃圾回收
查看>>
Web前端学习笔记——JavaScript 之继承、函数进阶
查看>>
Web前端学习笔记——JavaScript之面向对象游戏案例:贪吃蛇
查看>>
不做单元测试?小心得不偿失!嵌入式系统单元测试工具,自动生成测试用例
查看>>
一种实用的联网汽车无线攻击方法及车载安全协议
查看>>
光靠欺骗检测是不够的:对抗多目标跟踪的攻击
查看>>
基于微区块链的V2X地理动态入侵检测
查看>>
面向V2C场景的ADAS数字孪生模型构建方法
查看>>
Comma2k19数据集使用
查看>>