Spring笔记(七)

来源:互联网 发布:网络院线 英文 编辑:程序博客网 时间:2024/05/02 04:25

Spring基于@AspectJ和Schema的AOP

2016/6/21 13:08:12 seventeenWen


AspectJ的用法

public interface Waiter {    void greetTo(String name);    void serveTo(String name);}

public class NativeWaiter implements Waiter{public void greetTo(String name) {    System.out.println("NativeWaiter greetTo"+name);}public void serveTo(String name) {    System.out.println("NativeWaiter serveTo"+name);}}

@Aspectpublic class PreGreetAspectJ {    @Before("execution(* greetTo(..))")    public void beforeGreeting(){            System.out.println("你好! ");    }}

public class AspectJProxyTest {public static void main(String[] args) {    Waiter target =new NativeWaiter();    AspectJProxyFactory factory =new AspectJProxyFactory();    factory.setTarget(target);    factory.addAspect(PreGreetAspectJ.class);    Waiter proxy =factory.getProxy();    proxy.serveTo("seventeenWen");    proxy.greetTo("seventeenWen");}}

NativeWaiter serveToseventeenWen你好! NativeWaiter greetToseventeenWen

通过配置文件配置AspectJ切面

  1. 自动为使用了@AspectJ的类创建代理,它有一个属性proxy-target-class=”false”使用了JDK动态代理技术,true使用CGLib动态代理技术

@AspectJ注解语法


AspectJ切点表达式:关键字+操作参数

Spring支持AspectJ的九个切点表达式函数,分为四个类型:

  1. 方法切点函数:描述目标类方法信息定义
  2. 方法入参切点函数:描述目标类方法入参的信息定义
  3. 目标类切点函数:描述目标类类型信息定义
  4. 代理类切点函数:描述目标类的代理类饿信息定义

类名类别函数入参说明方法切点函数execution()方法匹配模式串满足某一匹配模式的所有目标类方法连接点@annotation()方法注解类名表示标注了特定的注解的目标方法的连接点方法入参切点函数args()通过判别目标类方法运行时入参对象的类型定义连接点@args()类型注解类名通过判别目标方法运行时入参对象的类是否标注特定的注解目标切点函数within()类型匹配串表示特定域下的所有连接点target()类名假如目标类按类型匹配于指定类,则目标类的所有连接点匹配这个切点@within()类型注解类名类型注解类名目标类标注了特定注解,则目标类所有连接点匹配该切点(包括实现类)目标类切点函数@target()类型注解类名目标类标注了特定注解,则目标类所有连接点匹配该切点代理类切点函数this()类名

AspectJ的通配符

  • *:匹配任意字符,但只能匹配上下文的一个元素
  • ..:匹配任意字符,可以匹配上下文的多个元素,表示类时必须和*一起使用,表示入参是则单独使用
  • +:表示按类型匹配的所有类,必须跟在类名后面,代表匹配类的继承和扩展指定类的所有类,同时还包括自己本身。

AspectJ的逻辑运算符

  • &&:与操作符,相当于切点的交集运算,如果在XML文件中配置,可以使用&的转义字符&amp代替,或者使用Spring提供的“and”,
  • ||:或操作符,相当于切点的并集运算,等效于“or”
  • !:非操作符,相当于切点的反集运算,等效于“not”

在操作符前后加空格

AspectJ的增强注解

@Before

前置增强,等于BeforeAdvice的功能

  • value:定义切点
  • argNames:Java的反射无法获得方法的入参名,所以必须通过注解标注增强方法的参数名,多个参数间用逗号隔开

@AfterReturning

后置增强,等于AfterReturningAdvice

  • value:定义切点
  • pointcut:表示切点的信息,如果指定,将覆盖value
  • returning:将目标对象的返回值绑定给增强的方法
  • argsNames:Java的反射无法获得方法的入参名,所以必须通过注解标注增强方法的参数名,多个参数间用逗号隔开

@Around

环绕增强:等于MethodInterceptor

  • value:定义切点
  • argsNames:

@AfterThrowing

抛出增强,等于ThrowsAdvice

  • value:定义切点
  • pointcut:
  • throwing:将抛出的异常绑定到增强方法上
  • argsNames:

@After

Final增强,不管是抛出异常还是正常退出,都会执行

  • value:
  • argsNames:

@DeclareParents

引介增强,等于IntroductionInterceptor

value:

deaultImpl:默认的接口实现

0 0
原创粉丝点击