SpringBoot中使用AOP

AOP即面向切面的编程,将业务逻辑代码和琐碎逻辑代码分开,达到重用或者解耦的目的

Spring中的AOP有两种实现,一种是基于jdk的,一种是基于cglib的,AopAutoConfiguration中相关代码如下:

  

一、基于jdk的动态代理实现

1、引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2、添加配置

spring.aop.proxy-target-class=false #默认true

3、实现接口

public interface IUserDao {
    void add(String username,String password);
}
@Component
public class UserDao implements IUserDao {

    public void add(String username,String password){
        System.out.println("add [username="+username+",password="+password+"]");
    }
}

4、构建切面类

@Aspect
@Component
public class LogAspect {

    @Before("execution(* com.leiyuke.temp..*.*(..))")
    public void log(){
        System.out.println("before method log done");
    }

    @After("execution(* com.leiyuke.temp..*.*(..))")
    public void afterLog(JoinPoint point){
        System.out.println("after method log done "+point.getTarget().getClass()+",args: "
              + Arrays.asList(point.getArgs())+", method: "+point.getSignature()); } }

5、测试如下:

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        ConfigurableApplicationContext context=SpringApplication.run(App.class, args);
        System.out.println(context.getBean(IUserDao.class).getClass());
        context.getBean(IUserDao.class).add("sl","1234");
        context.close();
    }
}

  

二、基于cglib的动态代理实现

  默认cglib实现,只需把文件中配置项改为true,或删掉配置项,或不使用接口(直接用UserDao)都可以实现

  

总结

  1)使用jdk动态代理需要满足两个条件,否则会使用默认的cglib

  a)spring.aop.proxy-target-class=false

  b)需要代理的类实现接口

  2)使用cglib动态代理可以使用接口,也可以不使用接口,spring.aop.proxy-target-class可以设置为true或删掉

  3)LogAspect是切面类,封装了横切关注点,使用@Aspect标记,并且装配到spring容器中

    @Before是前置通知,调用add方法前先执行

    @After是后置通知,调用完add方法后执行

    参数execution(* com.edu.spring.springboot..*.*(..))表示该包(或者其子包)下的任何类中的任何方法都会被动态代理。

    JoinPoint类中封装了被代理的对象,包括目标类、方法、参数。前置通知、后置通知都可以使用JoinPoint。

 

posted @ 2019-12-08 18:13  雷雨客  阅读(1089)  评论(0)    收藏  举报