注解实现的spring-aop

Posted kill-9

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了注解实现的spring-aop相关的知识,希望对你有一定的参考价值。

接口:

 1 package spring.aop;
 2 
 3 public interface Arithmetic {
 4 
 5     Integer add(Integer a,Integer b);
 6     Integer sub(Integer a,Integer b);
 7     Integer div(Integer a,Integer b);
 8 
 9 
10 }

实现类:

 1 package spring.aop;
 2 
 3 import org.springframework.stereotype.Component;
 4 
 5 @Component
 6 public class ArithmeticImpl implements Arithmetic{
 7 
 8     @Override
 9     public Integer add(Integer a, Integer b) {
10         System.out.println("add -> "+(a+b));
11         return a+b;
12     }
13 
14     @Override
15     public Integer sub(Integer a, Integer b) {
16         System.out.println("sub -> "+(a-b));
17         return a-b;
18     }
19 
20     @Override
21     public Integer div(Integer a, Integer b) {
22         System.out.println("div -> "+(a/b));
23         return a/b;
24     }
25 
26 
27 }

配置文件:aop.xml

<?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:p="http://www.springframework.org/schema/p"
       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="spring.aop"/>

    <!--自动为匹配的类生成代理对象-->
    <aop:aspectj-autoproxy proxy-target-class="true" />

</beans>

验证切面:

 1 package spring.aop;
 2 
 3 import org.aspectj.lang.JoinPoint;
 4 import org.aspectj.lang.annotation.Aspect;
 5 import org.aspectj.lang.annotation.Before;
 6 import org.springframework.core.annotation.Order;
 7 import org.springframework.stereotype.Component;
 8 
 9 import java.util.Arrays;
10 
11 @Order(1)
12 @Aspect
13 @Component
14 public class VliAspect {
15 
16     @Before("spring.aop.aspect.declareJointPointExpression()")
17     public void validateArgs(JoinPoint joinPoint){
18 
19         System.out.println("validateArgs -> "+ Arrays.asList(joinPoint.getArgs()));
20     }
21 }

主切面

 1 package spring.aop;
 2 
 3 import org.aspectj.lang.JoinPoint;
 4 import org.aspectj.lang.annotation.*;
 5 import org.springframework.core.annotation.Order;
 6 import org.springframework.stereotype.Component;
 7 
 8 import java.util.Arrays;
 9 import java.util.List;
10 
11 //声明这个切面的优先级,值越小,优先级越高
12 @Order(2)
13 //声明这个类是一个切面
14 @Aspect
15 @Component
16 public class aspect {
17 
18     //定义一个方法,用于声明切点表达式,一般该方法不写其他代码
19     @Pointcut("execution( * spring.aop.*.*(*,*))")
20     public void declareJointPointExpression(){}
21 
22     //声明该方法是一个前置通知
23     @Before("declareJointPointExpression()")
24     public void beforeMethod(JoinPoint joinPoint){
25         String methodName = joinPoint.getSignature().getName();
26         List<Object> args = Arrays.asList(joinPoint.getArgs());
27         System.out.println("methodName:"+methodName+"--->before args: "+args);
28     }
29 
30 
31     //声明该方法是一个后置通知,无论是否发生异常,都会在目标方法执行后执行
32     //后置通知无法访问目标方法的执行结果
33     @After("declareJointPointExpression()")
34     public void afterMethod(JoinPoint joinPoint){
35         String methodName = joinPoint.getTarget().getClass().getName();
36         List<Object> args = Arrays.asList(joinPoint.getArgs());
37         System.out.println("methodName:"+methodName+"--->after args: "+args);
38     }
39 
40     //返回通知,目标方法正常结束后执行
41     //可以访问方法的返回值
42     @AfterReturning(value = "declareJointPointExpression()",returning = "result")
43     public void afterReturning(JoinPoint joinPoint,Object result){
44         String methodName = joinPoint.getSignature().getName();
45         System.out.println("methodName:"+methodName+"--->afterReturning args: "+result);
46 
47     }
48 
49     @AfterThrowing(value = "declareJointPointExpression())",throwing = "e")
50     public void afterThrowing(JoinPoint joinPoint,Exception e){
51         String methodName = joinPoint.getSignature().getName();
52         System.out.println("methodName:"+methodName+"--->afterThrowing args: "+e);
53 
54     }
55 }

测试类

package spring.aop;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

    public static void main(String[] args){

        ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:aop.xml");
        Arithmetic proxy = ac.getBean("arithmeticImpl",ArithmeticImpl.class);
        proxy.add(3,5);
        System.out.println("-----------------------");
        proxy.sub(3,0);
        System.out.println("-----------------------");
        proxy.div(3,0);
        System.out.println("-----------------------");
    }
}

结果

技术分享图片

以上是关于注解实现的spring-aop的主要内容,如果未能解决你的问题,请参考以下文章

注解实现的spring-aop

Spring-AOP切面编程

模仿spring-aop的功能,利用注解搭建自己的框架。

Spring-AOP用法总结

Spring-AOP学习笔记-04 注解配置

spring-aop的简单实例注解版