AspectJ基于注解的AOP 实现

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop.xsd">

<!--   把对象装到容器中-->
   <bean id="myServiceImpl" class="org.example.ba.impl.myServiceImpl"/>
<!--   切面对象-->
   <bean id="myAspect" class="org.example.ba.myAspect"/>
<!--   自动代理生成器-->
   <aop:aspectj-autoproxy/>
</beans>

DEMO

@Aspect
public class myAspect {

    /*
    //前置通知
    定义方法,方法是实现切面功能的。方法的定义要求:
     1.公共方法 public
     2.方法没有返回值
     3.方法名称自定义
     4.方法可以有参数,也可以没有参数。
      如果有参数,参数不是自定义的,有几个参数类型可以使用。

    指定通知方法中的参数: Joinpoint
    Joinpoint: 业务方法,要加人切面功能的业务方法
    作用是:可以在通知方法中获取方法执行时的信息,例如方法名称,
    方法的实参。如果你的切面功能中需要用到方法的信息,就加入Joinpoint.
    这个JoinPoint参数的值是由框架赋予,必须是第一个位置的参数*/


    /*
    @Before(value = "execution(public void org.example.ba.impl.myServiceImpl.init(..))")
    public void doAspect(JoinPoint joinPoint){
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            System.out.println("方法的参数arg======"+arg);
        }
        Signature signature = joinPoint.getSignature();
        System.out.println("方法的定义签名signature======"+signature);
        String name = joinPoint.getSignature().getName();
        System.out.println("方法的名称name======="+name);
        System.out.println("doAspect");

    }
   */

    /*
//    后置通知
    后置通知定义方法,方法是实现切面功能的。方法的定义要求:
    1.公共方法 public
    2.方法没有返回值
    3.方法名称自定义
    4.方法有参数的,推荐是object,参数名自定义

     注解有returning属性
    在目标方法执行之后执行。由于是目标方法之后执行,所以可以获取到目标方法的返回
     值。该注解的 returning 属性就是用于指定接收方法返回值的变量名的。所以,被注解为后
    置通知的方法,除了可以包含 JoinPoint 参数外,还可以包含用于接收返回值的变量。该变
    量最好为 Object 类型,因为目标方法的返回值可能是任何类型。*/

                   /*2.returning自定义的变量,
                   表示目标方法的返回值的。
                   自定义变量名必须和通知方法的形参名一样。
                   */
    /*
    @AfterReturning(value = "execution(* *..*.myServiceImpl.destroy(..))",

                   returning = "o")
    public void doAspect(Object o){
        System.out.println("returning返回值====="+o);
    }
    */
    //环绕通知
    /*环绕通知方法的定义格式
    1.public
    2.必须有一个返回值,推荐使用object
    3.方法名称自定义
    4.方法有参数,固定的参数 ProceedingJoinpoint

    */
    @Around(value = "execution(* org.example.ba.impl.myServiceImpl.destroy(..))")
    public  Object doinit(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {

        Object proceed =null;
        System.out.println("方法运行之前时间"+new Date());
        proceed=proceedingJoinPoint.proceed();//等于 Object proceed=destroy()
        System.out.println("方法运行之后时间"+new Date());
        System.out.println(proceed);
        return proceed;
    }
}

 

上一篇:AOP面向切面编程:AspectJ:注解开发


下一篇:Spring学习 之 AOP切面执行顺序的控制