SpringBoot 源码解析 (十)—– Spring Boot 精髓:集成AOP

本篇主要集成Sping一个重要功能AOP

我们还是先回顾一下以前Spring中是如何使用AOP的,大家可以看看我这篇文章spring5 源码深度解析—– AOP的使用及AOP自定义标签

Spring中使用AOP

引入Aspect

<dependency>
    <groupId>org.aspectjgroupId>
    <artifactId>aspectjweaverartifactId>
    <version>${aspectj.version}version>
dependency>

创建用于拦截的bean

public class TestBean {
    private String message = "test bean";

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public void test(){
        System.out.println(this.message);
    }
}

创建Advisor

@Aspect
public class AspectJTest {
    @Pointcut("execution(* *.test(..))")
    public void test(){
    }

    @Before("test()")
    public void beforeTest(){
        System.out.println("beforeTest");
    }

    @Around("test()")
    public Object aroundTest(ProceedingJoinPoint p){
        System.out.println("around.....before");
        Object o = null;
        try{
            o = p.proceed();
        }catch(Throwable e){
            e.printStackTrace();
        }
        System.out.println("around.....after");
        return o;
    }

    @After("test()")
    public void afterTest()
    {
        System.out.println("afterTest");
    }
 }

创建配置文件

要在Spring中开启AOP功能,还需要在配置文件中作如下声明,开启AOP:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    class="com.yhl.myspring.demo.aop.TestBean">

    class="com.yhl.myspring.demo.aop.AspectJTest"/>

注解开启AOP

开启AOP

SpringBoot集成AOP

添加pom依赖

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-aopartifactId>
dependency>

引入了AOP的场景启动器,我们点击去看看

SpringBoot 源码解析 (十)----- Spring Boot 精髓:集成AOP

还是引入了spring-aop和aspectj的依赖,和我们Spring集成AOP是引入了相同的包,接着我们直接就可以创建Advisor了,如上AspectJTest这个类,但是我们并没有通过 @EnableAspectJAutoProxy开启AOP呢?那是因为AOP的自动配置类帮我们开启了

AopAutoConfiguration

一旦导入了spring-boot-starter-aop依赖后,SpringBoot就会启动AOP的自动配置类AopAutoConfiguration:

SpringBoot 源码解析 (十)----- Spring Boot 精髓:集成AOP

我们来看看AopAutoConfiguration这个自动配置类

@Configuration
@ConditionalOnClass({ EnableAspectJAutoProxy.class, Aspect.class, Advice.class })
@ConditionalOnProperty(prefix = "spring.aop", name = "auto", havingValue = "true", matchIfMissing = true)
public class AopAutoConfiguration {

    @Configuration
    //使用注解开启AOP功能
    @EnableAspectJAutoProxy(proxyTargetClass = false)
    @ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false", matchIfMissing = true)
    public static class JdkDynamicAutoProxyConfiguration {

    }

    @Configuration
    //使用注解开启AOP功能
    @EnableAspectJAutoProxy(proxyTargetClass = true)
    @ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true", matchIfMissing = false)
    public static class CglibAutoProxyConfiguration {

    }

}

不管使用jdk代理还是cglib代理,都有@EnableAspectJAutoProxy注解,所以只要导入spring-boot-starter-aop依赖后,就自动帮我们开启了AOP,我们可以直接添加切面使用AOP了

@EnableAspectJAutoProxy这个注解是整个AOP的灵魂,其作用和

Original: https://www.cnblogs.com/java-chen-hao/p/11850862.html
Author: chen_hao
Title: SpringBoot 源码解析 (十)—– Spring Boot 精髓:集成AOP

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538987/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java 泛型程序设计

    1. 泛型类 public class Pair<t> { private T first; private T second; public void setSeco…

    Java 2023年6月16日
    080
  • Netty之DefaultAttributeMap与AttributeKey的机制和原理

    1.什么是 DefaultAttributeMap? DefaultAttributeMap 是一个 &#x6570;&#x7EC4; &#xFF0B; &…

    Java 2023年6月7日
    061
  • SpringSecurity

    SpringSecurity 11.1 SpringSecurity简介 Spring 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spr…

    Java 2023年6月5日
    063
  • 反射取得静态类中的属性,方法,字段

    欢迎加我的QQ群:193522571,一起来讨论、交流! Type BstrType = typeof(CadBaseSet);DataTable dt = (DataTable)…

    Java 2023年5月30日
    073
  • java多线程如何设置优先级

    从thread类中,我们可以看到类中预先定义了三个优先级。通过getpriority可以看到新建线程的默认等级。 public class ExtendsThread { publ…

    Java 2023年5月29日
    082
  • 面试突击59:一个表中可以有多个自增列吗?

    自增列可使用 auto_increment 来实现,当一个列被标识为 auto_increment 之后,在添加时如果不给此列设置任何值,或给此列设置 NULL 值时,那么它会使用…

    Java 2023年5月29日
    068
  • SpringBoot 系列 web 篇之自定义返回 Http Code 的 n 种姿势

    虽然 http 的提供了一整套完整、定义明确的状态码,但实际的业务支持中,后端并不总会遵守这套规则,更多的是在返回结果中,加一个 code 字段来自定义业务状态,即便是后端 5xx…

    Java 2023年5月30日
    059
  • spring-session 2.0 实现细节

    一、 前置知识 redis 在键实际过期之后不一定会被删除,可能会继续存留 具有过期时间的 key 有两种方式来保证过期 一是这个键在过期的时候被访问了 二是后台运行一个定时任务自…

    Java 2023年5月30日
    069
  • 1.19(设计模式)策略模式

    策略模式,定义一组算法(代码),将它们封装起来,使其可以相互替换。 策略模式首先要针对不同的情况(算法、代码)定义不同的策略类。 首先看个一段代码 要想插入代码有什么方法呢,我们可…

    Java 2023年6月8日
    066
  • SpringBoot集成Thymeleaf发送Html邮件报错

    由于业务需求需要使用Thymeleaf作为模板发送Html邮件,开发调试过程中发生以下错误 开始以为是Classpath下不存在这个文件或者解析时候传入参数不对等等原因,排查了半天…

    Java 2023年6月13日
    072
  • 如何去官网下载JDK (JDK8 JDK1.8)

    posted @2022-01-12 16:23 戈博折刀 阅读(119 ) 评论() 编辑 Original: https://www.cnblogs.com/libin6505…

    Java 2023年5月30日
    085
  • 差分数组入门

    差分数组 什么是差分数组? 差分数组:差分数组就是原始数组相邻元素之间的差。 其实差分数组是一个 辅助数组,从侧面来表示给定某一数组的变化,一般用来对数组进行区间修改的操作。 比如…

    Java 2023年6月15日
    067
  • MySQL 优化篇(二)

    分析查询语句:EXPLAIN 定位了查询慢的SQL之后,我们就可以使用EXPLAIN或DESCRIBE工具做针对性的分析查询语句。DESCRIBE 语句的使用方法与EXPLAIN语…

    Java 2023年6月8日
    071
  • Nginx总结目录

    Original: https://www.cnblogs.com/qtiger/p/16021987.htmlAuthor: 搬砖滴Title: Nginx总结目录

    Java 2023年5月30日
    070
  • Spring Boot 2.7.0 更新说明

    Spring Boot 又接连发布了三个版本: Spring Boot 2.7.0(最新) Spring Boot 2.6.8 Spring Boot 2.5.14 后面两个版本都…

    Java 2023年6月8日
    080
  • Java源码详解系列(十二)–Eureka的使用和源码

    eureka 是由 Netflix 团队开发的针对中间层服务的负载均衡器,在微服务项目中被广泛使用。相比 SLB、ALB 等负载均衡器,eureka 的服务注册是无状态的,扩展起来…

    Java 2023年6月13日
    074
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球