AOP快速上手

243 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

AOP

1. AOP核心概念

  • Target(目标对象):代理的目标对象
  • Proxy(代理):一个类贝AOP植入增强后,就产生一个结果代理类
  • Joinpoint(连接点):被拦截到的点(方法),就是可以被增强的方法
  • Pointcut(切入点): 指我们要对哪些JoinPoint进行拦截的定义,被增强了的连接点
  • Advice(通知,增强 拦截到JoinPoint后要做的事情就是通知,封装业务逻辑的方法
  • Aspect(切面): 切入点和通知的结合
  • Weaving(织入): 将切点和通知结合的过程,理解为织入过程

【开发注意事项】

谁是切点?(切点表达式)

谁是通知?(切面类中的增强方法)

将切点和通知进行织入配置。

2. AOP入门案例

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

step1:导入pom.xml坐标

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <!--spring依赖,会将spring-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>
  </dependencies>

step2:制作连接点方法,就是写个dao接口和一个实现类。

public interface BookDao {
    public void save();
    public void update();
}
@Component
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");
    }
}

注意这里@Component已经把该实现类注册成bean了。

step3:写通知类和方法

通知类必须配置成spring管理的Bean,用@Component就行。

@Component
public class MyAdvice {
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

step4、step5:定义切入点,绑定切入点与通知的关系

绑定方式一:

@Component
//设置当前的类为切面类
@Aspect
public class MyAdvice {
    @Pointcut("execution(void com.ydl.dao.BookDao.update())")
    private void pt(){}
    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

绑定方式二:

@Component
//设置当前的类为切面类
@Aspect
public class MyAdvice {
    @Before("execution(void com.ydl.dao.BookDao.update())")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

上述代码解释:

@Pointcut注解设置切入点,要求配置在方法上方

@Before设置到前面,设置在切入点pt()的前面运行当前操作(前置通知)

切入点表达式execution(void com.ydl.dao.BookDao.update())

Spring配置类

@Configuration
@ComponentScan("com.ydl")
//注解开发AOP功能
@EnableAspectJAutoProxy
public class SpringConfig {
}

@EnableAspectJAutoProxy开启AOP注解

测试类测试

public class App {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bean = ctx.getBean(BookDao.class);
        bean.update();
    }
}