zoukankan      html  css  js  c++  java
  • Spring学习笔记(九)AOP操作演示(AspectJ注解)

    AOP操作(AspectJ注解)

    1.创建类,在类中定义方法

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

    对类中方法进行增强
    2.创建增强类(编写增强逻辑)

    • 在增强类中,创建方法,让不同方法代表不同通知类型
    //增强的类
    public class UserProxy {
        // 前置通知
        public void before(){
            System.out.println("before ......");
        }
    }
    

    3.进行通知的配置
    (1)在Spring配置文件中,开始注解扫描

    <!--开启注解扫描-->
    <context:component-scan base-package="com.day9"></context:component-scan>
    //注意命名空间也要引入aop和context
    

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

    @Component // 被增强的类
    public class User {
        public void add(){
            System.out.println("add ......");
        }
    }
    
    @Component // 增强类
    @Aspect // 生成代理对象
    //增强的类
    public class UserProxy {
        // 前置通知
        public void before(){
            System.out.println("before ......");
        }
    }
    

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

    @Component // 增强类
    @Aspect // 生成代理对象
    //增强的类
    public class UserProxy {
    

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

    !--开启Aspect生成代理对象-->
    <!--如果在类上发现@Aspect注解,就把该类生成对代理对象-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           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.qy"></context:component-scan>
    
        <!--开启Aspect生成代理对象-->
        <!--如果在类上发现@Aspect注解,就把该类生成对代理对象-->
        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    
    </beans>
    

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

    @Component // 增强类
    @Aspect // 生成代理对象
    public class UserProxy {
        // 前置通知
        //@Before注解表示作为前置通知
        @Before(value = "execution(* com.day9.aopanno.User.add(..))")
        public void before(){
            System.out.println("before ......");
        }
    }
    

    5.测试

    public class test {
        @Test
        public void test(){
            ClassPathXmlApplicationContext context =
                    new ClassPathXmlApplicationContext("com/day9/aopanno/bean.xml");
            User user = context.getBean("user", User.class);
            user.add();
        }
    }
    

    6.其他类型的通知类型

    @Component // 增强类
    @Aspect // 生成代理对象
    public class UserProxy {
        // 前置通知
        //@Before注解表示作为前置通知
        @Before(value = "execution(* com.day9.aopanno.User.add(..))")
        public void before(){
            System.out.println("before ......");
        }
    
        //后置通知(也叫做最终通知)
        @After(value = "execution(* com.day9.aopanno.User.add(..))")
        public void after(){
            System.out.println("after ......");
        }
    
        //返回通知(如果有异常,不会执行返回通知)
        @AfterReturning(value = "execution(* com.day9.aopanno.User.add(..))")
        public void afterReturning(){
            System.out.println("afterReturning ......");
        }
    
        //异常通知
        @AfterThrowing(value = "execution(* com.day9.aopanno.User.add(..))")
        public void afterThrowing(){
            System.out.println("afterThrowing ......");
        }
    
        //环绕通知
        @Around(value = "execution(* com.day9.aopanno.User.add(..))")
        public void before(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
            System.out.println("环绕之前 ......");
            // 执行被增强的方法
            proceedingJoinPoint.proceed();
            System.out.println("环绕之后 ......");
        }
    }
    
  • 相关阅读:
    js判断手机访问网站自动跳转到手机版
    php 操作数组 (合并,拆分,追加,查找,删除等)
    jQuery传值方法汇总:jQuery.get、jQuery.getJSON、jQuery.post
    JS 页面跳转
    优秀的项目管理者书籍
    Python 的人生
    架构设计流程梳理
    重新定义自己思考问题的方式
    梳理
    程序员高效工具列表
  • 原文地址:https://www.cnblogs.com/Emuaer/p/15097979.html
Copyright © 2011-2022 走看看