zoukankan      html  css  js  c++  java
  • Spring AOP实例操作 简单易懂

    AOP的功能,不改变源代码可以增强类中的方法      (增强 = 代理

    AOP切入点表达式:

    execution([权限修饰符] [返回值类型] [类全路径] [方法名称] ([参数列表]))

    例如:

    @Before(value = "execution(* com.minelsg.User.add(..))")
    

    连接点

    在一个类中,哪些方法可以被增强,那这些方法就称为连接点

    切入点

    实际被真正增强的方法,称为切入点

    通知(增强)

    实际增强的逻辑部分称为通知(增强)。
    通知有多种类型:前置通知、后置通知、环绕通知、异常通知、最终通知。
    --------------------------------------------------------------------
    #前置通知@Before:   方法之前会执行
    #后置通知@AfterReturning: 方法之后会执行
    #环绕通知@Around:   方法的前面和后面都会执行
    #异常通知@AfterThrowing: 当方法出现异常会执行
    #最终通知@After:   不管有没有异常都会执行类似于finally

    切面

    把通知应用到切入点的过程就称为切面

    以下为实例:

    被增强类

    @Component
    public class User {
        public void add() {
            System.out.println("add.......");
        }
    }
    

    增强的类(代理类)

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

    通过Ioc注入后执行

    public class TestAop {
        @Test
        public void testAopAnno(){
            ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
            User user = (User)context.getBean("user");
            user.add();
        }
    }
    

    输出结果

    环绕之前.........
    before.....
    add.......
    AfterReturning.........
    after......
    环绕之后.........
    

     done~~

  • 相关阅读:
    [Ceoi2011]Traffic
    [中山市选2011]杀人游戏
    牛客 表达式得到期望结果的组成种数
    牛客 数字字符串转换为字母组合的种数
    牛客 龙与地下城游戏
    UVA 1103 Ancient Messages
    牛客 字符串的交错组成
    牛客 最小编辑代价
    牛客 子数组异或和为0的最多划分
    牛客 最长公共子串问题
  • 原文地址:https://www.cnblogs.com/MineLSG/p/13291249.html
Copyright © 2011-2022 走看看