SpringBoot框架(10) -- AOP

SpringBoot的AOP的开启有2种方式

  1. 基于SpringBoot的AOP写法,在配置文件中配置

spring.aop.auto=true # 是否启用aop
spring.aop.proxy-target-class=false # false(默认)代理方式有接口使用jdk动态代理,true强制使用cglib代理。
  1. 基于SpringBoot注解做法 @EnableAopProxyClass

exposeProxy属性表示如果使用true就可以使用AopContext对象获取当前代理对象,false则不能使用
proxyTargetClass true表示使用jdk的动态代理, false表示使用cglib代理
 引入SpringBoot的AOP依赖spring-boot-starter-aop
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.11</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <groupId>com.mike.study</groupId>
  <artifactId>springboot-aop</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>springboot-aop</name>
  <description>Demo project for Spring Boot</description>

  <properties>
    <java.version>1.8</java.version>
  </properties>

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

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

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>
 
 
类添加@Aspect注解,指定切入的方法点,然后就可以在@Before和@After的方法实现增强逻辑。
假设有个BookDaoImpl.java如下:
import org.springframework.stereotype.Repository;

/**
 * @Classname BookDaoImpl
 * @Created by Michael
 * @Date 2023/5/16
 * @Description Book操作类
 */

@Repository
public class BookDaoImpl implements BookDao {
  @Override
  public void readBook(String name, String authod) {
    System.out.println("书名:"+name+",作者:"+authod);
  }
}
 
现在对readBook()方法增强,添加PointCut.java类,然后定义切入点POINT_CUT ,这里字符串含义是指定某个包下的所有类的所有方法。demo尝试在方法的前后打印信息
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import org.aspectj.lang.annotation.Aspect;

import java.util.Arrays;

/**
 * @Classname PointCut
 * @Created by Michael
 * @Date 2023/5/16
 * @Description AOP增强类
 */
@Component
@Aspect
public class PointCut {
  // 定义切入点
  /*
    execution(* 包名.*.*(..))
    切入点表达式:整个表达式可以分为五个部分:
    1、execution(): 表达式主体。
    2、第一个*号:方法返回类型, *号表示所有的类型。
    3、包名:表示需要拦截的包名。
    4、第二个*号:表示类名,*号表示所有的类。
    5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面( )里面表示方法的参数,两个句点表示任何参数
  */
  public static final String POINT_CUT = "execution(* com.mike.study.springbootaop.dao.*.*(..))";

  @Before(POINT_CUT)
  public void beforeReadBook(){
    System.out.println("+++++++++++++++++++++++");
    System.out.println("浏览目录");
    System.out.println("--------------");
  }

  @After(POINT_CUT)
  public void afterReadBook(JoinPoint jp){
    System.out.println("--------------");
    System.out.println("整理读书笔记");
    System.out.println(jp.getTarget());
    System.out.println("参数:"+ Arrays.asList(jp.getArgs()));
  }
}

  

调用readBook()

import com.mike.study.springbootaop.dao.BookDao;
import com.mike.study.springbootaop.dao.BookDaoImpl2;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
//@EnableAspectJAutoProxy(proxyTargetClass = false, exposeProxy = false)
public class SpringbootAopApplication {

  public static void main(String[] args) {
    ConfigurableApplicationContext context = SpringApplication.run(SpringbootAopApplication.class, args);
    BookDao bookDao = context.getBean(BookDao.class);
    bookDao.readBook("《Java从入门到删库跑路》","不详");

    BookDaoImpl2 bookDao2 = context.getBean(BookDaoImpl2.class);
    bookDao2.readBook("《代码重构》","不详");
    context.close();
  }

}

  

查看输出结果

 

 
 
 
 
posted @ 2023-05-16 23:25  天晴修屋顶  阅读(15)  评论(0编辑  收藏  举报