• Spring-AOP


    AOP概念理解

    在这里插入图片描述

    在这里插入图片描述
    参考博客

    连接点:所有方法。
    切入点:哪些方法需要追加功能的,匹配通知的方法,叫切入点。
    通知:各个方法共用的功能,叫通知。通知存在于通知类中。
    切面:切面描述的是通知共用的功能与所对应切入点的关系。在哪些切入点上执行哪些通知叫切面。
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    Demo1

    接口UserDao.java

    public interface UserDao {
        public void save();
        public void update();
    }
    
    • 1
    • 2
    • 3
    • 4

    实现类UserDaoImpl.java

    @Component("userDao")
    public class UserDaoImpl implements UserDao {
        private String username;
        public void setName(String name){
            this.username=name;
        }
        public void save() {
            System.out.println(System.currentTimeMillis());
            System.out.println("user dao save ...");
        }
        public void update(){
            System.out.println("user dao update...");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    APP6.java程序

    public class APP6 {
        public static void main(String[] args) {
            AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig.class);
            UserDao userDao=(UserDao) ctx.getBean("userDao");
            userDao.update();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    userDao.save结果
    在这里插入图片描述
    userDao.update结果
    在这里插入图片描述
    这里调用userDao.update无法显示时间,接下来用AOP的方法进一步实现。

    step1.导入aop依赖

    在这里插入图片描述

    <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-context</artifactId>
       <version>5.2.10.RELEASE</version>
    </dependency>
    <dependency>
       <groupId>org.aspectj</groupId>
       <artifactId>aspectjweaver</artifactId>
       <version>1.9.4</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    step2.定义userDao接口和实现类

    userDao接口和实现类在前面给了具体书写方法
    在这里插入图片描述

    step3.定义通知类,制作通知

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    public class MyAdvice {
        public void method(){
            System.out.println(System.currentTimeMillis());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    step4.定义切入点

    在这里插入图片描述

    public class MyAdvice {
        @Pointcut("execution(void com.itheima.dao.UserDao.update())")
        private void pt(){}
        public void method(){
            System.out.println(System.currentTimeMillis());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    step5:添加切入点和通知之间的关系

    在这里插入图片描述

    public class MyAdvice {
        @Pointcut("execution(void com.itheima.dao.UserDao.update())")
        private void pt(){}
        @Before("pt()")
        public void method(){
            System.out.println(System.currentTimeMillis());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    step6:定义通知类受spring容器管理

    在这里插入图片描述

    @Component
    @Aspect
    public class MyAdvice {
        @Pointcut("execution(void com.itheima.dao.UserDao.update())")
        private void pt(){}
        @Before("pt()")
        public void method(){
            System.out.println(System.currentTimeMillis());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    step7:开启Spring对AOP注解驱动支撑

    在这里插入图片描述

    @Configuration
    @Import({jdbcConfig.class})
    @ComponentScan("com.itheima")
    @EnableAspectJAutoProxy
    public class SpringConfig {
    //    1.定义方法获得要管理的对象
    //    2.添加@Bean,表示当前返回值是一个Bean
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    step8:run一下

    APP6.java

    public class APP6 {
        public static void main(String[] args) {
            AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig.class);
            UserDao userDao=(UserDao) ctx.getBean("userDao");
            userDao.update();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    okk!
    在这里插入图片描述

    AOP工作流程

    在这里插入图片描述

    AOP切入点表达式

    切入点表达式

    在这里插入图片描述
    在这里插入图片描述

    通配符

    在这里插入图片描述

    书写技巧

    在这里插入图片描述

    AOP通知类型

    前置通知

    在这里插入图片描述

    后置通知

    在这里插入图片描述

    环绕通知※

    在这里插入图片描述
    在这里插入图片描述
    UserDaoImpl.java

    @Component("userDao")
    public class UserDaoImpl implements UserDao {
        private String username;
        public void setName(String name){
            this.username=name;
        }
        public void save() {
            System.out.println(System.currentTimeMillis());
            System.out.println("user dao save ...");
        }
        public void update(){
            System.out.println("user dao update...");
        }
        public int select(){
            System.out.println("book dao select is running...");
            return 666;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    MyAdvice.java

    @Component
    @Aspect
    public class MyAdvice {
        @Pointcut("execution(int com.itheima.dao.UserDao.select())")
        private void pt(){}
        @Around("pt()")
        public Object method(ProceedingJoinPoint pjp) throws Throwable {
    //        System.out.println(System.currentTimeMillis());
            System.out.println("hello1");
            Object tmp=pjp.proceed();
            System.out.println("hello2");
            return tmp;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    AOP通知获取数据

    在这里插入图片描述
    在这里插入图片描述

    //注解中的returing和形参需要保持一致
    @AfterReturing(value = "pt()",returing="ret")
    public void afterReturning(String ret){
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    在这里插入图片描述

    AOP总结

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    参考博客

  • 相关阅读:
    美团闪购:闪电仓商户如狼似虎,传统商超便利店坐享其成?
    Java--SpringMVC概述,运行流程
    国产信号发生器 1442/1442A射频信号发生器
    某电商网站的数据库设计(8)——创建花费信息查询视图
    广西南宁新能源汽车电机定子三维扫描3D尺寸测量检测-CASAIM中科广电
    【acwing总结】快速排序
    Springboot中的多环境开发
    数据库三范式
    【正厚技术】CentOS使用基础
    国鑫受邀出席2023松山湖软件和信息服务业高质量发展大会
  • 原文地址:https://blog.csdn.net/weixin_42888638/article/details/125476196