Spring_AOP操作:AspectJ注解

1.创建一个类,在类里面定义方法

User.java

2.创建增强类(便捷增强逻辑)

(1)在增强类里面,创建方法,让不同方法代表不同通知类型

UserProxy.java

 

3.进行通知的配置

(1)在Spring的配置文件中,开启注解扫描

<?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:context="http://www.springframework.org/schema/context" 
   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/context http://www.springframework.org/schema/context/spring-context.xsd 
                    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> 
          <!--开启注解扫描--> 
             <context:component-scan base-package="com.tinstu.spring.aopa"></context:component-scan> 
          <!--开启Aspect生成代理对象--> 
             <aop:aspectj-autoproxy></aop:aspectj-autoproxy> 
 </beans>

 

(2)使用注解创建User和Userproxy对象

package com.tinstu.spring.aopa;
import org.springframework.stereotype.Component;

//被增强的一个类
@Component
public class User {
    public void add(){
        System.out.println("add.....");
    }
}

(3)在增强类上面添加注解@Aspect

4-(1) 中代码

(4)在Sping配置文件中开启生产代理对象

<!--开启Aspect生成代理对象-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

4.配置不同类型的通知

(1)在增强类的里面,在作为通知方法上面添加通知类型注解,使用切入点表达式配置.

package com.tinstu.spring.aopa;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.omg.CORBA.PUBLIC_MEMBER;
import org.springframework.stereotype.Component;

//增强的类
@Component
@Aspect     //生成代理对象
public class UserProxy {
    //前置通知
    //@Before 注解表示作为前置通知
    @Before(value = "execution(* com.tinstu.spring.aopa.User.add(..))")
    public void before(){
        System.out.println("before........");
    }
    //后置通知(返回通知) 有异常不执行
    @AfterReturning(value = "execution(* com.tinstu.spring.aopa.User.add(..))")
    public void afterReturning(){
        System.out.println("afterReturning......");
    }
    //异常通知 有异常才执行
    @AfterThrowing(value = "execution(* com.tinstu.spring.aopa.User.add(..))")
    public void afterThrowing(){
        System.out.println("afterThrowing......");
    }
    //最终通知 有异常也执行
    @After(value = "execution(* com.tinstu.spring.aopa.User.add(..))")
    public void after(){
        System.out.println("after......");
    }
    //环绕通知
    @Around(value = "execution(* com.tinstu.spring.aopa.User.add(..))")
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("环绕之前......");

         //被增强的方法执行
        proceedingJoinPoint.proceed();

        System.out.println("环绕之后......");
    }
}

test.java

import com.tinstu.spring.aopa.User;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class test {

    @Test
    public void aop(){
        //加载spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        //获取配置创建对象
        User user = context.getBean("user", User.class);
        user.add();
    }

}

执行结果

5.相同的切入点抽取

在上面的UserProxy.java((4)-1代码中):

@After @before @AfterThrowing ......等注解中,他们的切入点相同,也就是value中的值

    //相同切入点抽取
    @Pointcut(value = "execution(* com.tinstu.spring.aopa.User.add(..))")
    public void pointdemo(){
        
    }
    //前置通知
    //@Before 注解表示作为前置通知
    @Before(value = "pointdemo()")
    public void before(){
        System.out.println("before........");
    }
  . . . . . .
  . . .

6.有多个增强类对同一个方法进行增强,设置增强类的优先级

接上面,PersonProxy.java也对User.java进行增强

(1)在增强类上面添加注解@Order(数字类型值),数字类型值越小优先级越高

在PersonProxy.java中加入 @Order(1)

在Userproxy.java中加入 @Order(3)

package com.tinstu.spring.aopa;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Aspect
@Order(1)     //
public class PersonProxy {
    //后置通知(返回通知)
    @Before(value = "execution(* com.tinstu.spring.aopa.User.add(..))")
    public void afterReturning(){
        System.out.println("Person Before.........");
    }
}

阅读剩余
THE END