AOP入门案例

AOP入门案例

案例设定:测定接口执行效率
简化设定:在接口执行前输出当前系统时间
开发模式:XML or 注解

思路分析

  1. 导入坐标(pom.xml)
  2. 制作连接点方法(原始操作,Dao接口与实现类)
  3. 制作共性功能(通知类与通知)
  4. 定义切入点
  5. 绑定切入点与通知关系(切面)

实现步骤(注解版)

  1. 导入aop相关坐标说明:spring-context坐标依赖spring-aop坐标。

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.4</version>
    </dependency>
    

  2. 定义dao接口与实现类

    // BookDao.java
    public interface BookDao {
        void save();
        void update();
    }
    
    // BookDaoImpl.java
    @Repository
    public class BookDaoImpl implements BookDao {
        @Override
        public void save() {
            System.out.println(System.currentTimeMillis());
            System.out.println("book dao save ...");
        }
    
        @Override
        public void update() {
            System.out.println("book dao update ...");
        }
    }
    
  3. 定义通知类,制作通知

    public class MyAdvice {
        // 通知
        public void method(){
            System.out.println(System.currentTimeMillis());
        }
    }
    
  4. 定义切入点

    public class MyAdvice {
        // 定义切入点
        @Pointcut("execution(void com.charley.dao.BookDao.update())")
        private void pt(){}
    
        // 通知
        public void method(){
            System.out.println(System.currentTimeMillis());
        }
    }
    

    说明:切入点定义依托一个不具有实际意义的方法进行,即无参数,无返回值,方法体无实际逻辑

  5. 绑定切入点与通知关系,并指定通知添加到原始连接点的具体执行位置

    public class MyAdvice {
        // 定义切入点
        @Pointcut("execution(void com.charley.dao.BookDao.update())")
        private void pt(){}
    
        // 把切入点和通知绑定好
        @Before("pt()")
        // 定义好通知
        public void method(){
            System.out.println(System.currentTimeMillis());
        }
    }
    
  6. 定义通知类受spring容器管理,并定义当前类为切面类

    @Component  //告诉spring这段代码受其控制
    @Aspect // 告诉spring这段代码是做AOP的
    public class MyAdvice {
        // 定义切入点
        @Pointcut("execution(void com.charley.dao.BookDao.update())")
        private void pt(){}
    
        // 把切入点和通知绑定好
        @Before("pt()")
        // 定义好通知
        public void method(){
            System.out.println(System.currentTimeMillis());
        }
    }
    
  7. 开启Spring对AOP注解驱动支持

    @Configuration
    @ComponentScan("com.charley")
    @EnableAspectJAutoProxy   // 告诉程序有注解开发的aop
    public class SpringConfig {
    }