1. 程式人生 > >Spring Boot 整合AOP

Spring Boot 整合AOP

在這裡多談一些關於AOP 方面的知識,如果你對AOP 方面的知識比較熟悉,可以直接略過這個段落,往下看。

一、AOP概述

AOP(面向切面程式設計) 概念:這種在執行時,動態地將程式碼切入到類的指定方法、指定位置上的程式設計思想就是面向切面的程式設計。

AOP 相關術語:

  • Aspect(切面):指橫切性的關注點的抽象即為切面,它與類相似,只是兩者的關注點不一樣,類是對物體特徵的抽象,而切面是對橫切性關注點的抽象。是Pointcut和Advice的結合,切面可以由多個Poincut和Advice組成。
  • Joinpoint(連線點):被攔截的點(也就是需要被攔截的類的方法)。在spring中,這些點指的只能是方法,因為Spring只支援方法型別的攔截,實際上Joinpoint還可以攔截field或類構造器。
  • Pointcut(切點):對Jointpoint(連線點)進行攔截的定義,也就是在切面中定義的方法,並宣告該方法攔截了Jointpoint(連線點)。
  • Advice(通知):切入點攔截到Jointpoint(連線點)之後要做的事情。通知分為前置通知(@Before)、後置通知(@AfterReturning)、異常通知(@AfterThrowing)、最終通知(@After)和環繞通知(@Around)。
  • Target(目標物件):代理的目標物件。
  • Weave(織入):指將aspects應用到target物件並使proxy物件建立的過程稱為織入。

五種基本通知型別註解:

  • 前置通知(@Before):攔截目標方法,在目標方法執行之前開始執行。
  • 後置通知(After):在目標方法執行之後開始執行。也可以獲取目標方法的返回值。
  • 返回通知(@AferRunning):在方法返回執行結果之後執行。
  • 異常通知(@AfterThrowing):在目標方法丟擲異常後,執行增強。
  • 環繞通知(@Around):相當於整個代理模式過程,圍繞方法執行。

二、在Spring Boot 中使用AOP

開發流程:

  1. 在pom.xml 中引入AOP 依賴。
  2. 寫一個類,加上@Aspect 註解,封裝橫切關注點,配置對應的通知。
  3. 將這個類納入到Spring 容器中。

過程實現:

在pom.xml 中新增AOP 依賴

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

Person 類

package com.jas.aop;

import org.springframework.stereotype.Component;

@Component
public class Person {
    public void sayHi(){
        System.out.println("Hello");
    }
}

Log 類

package com.jas.aop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/** 使用@Component 把這個類納入到Spring 容器,@Aspect 註解表示這個類是一個切面類 */
@Component
@Aspect
public class Log {
    /** 定義一個前置通知*/
    /** 匹配com.jas.aop 包及其子包下的所有方法 */
    @Before("execution(* com.jas.aop..*.*(..))")
    public void log(){
        System.out.println("... before ...");
    }
}   

測試類(入口類)

package com.jas.springboot;

import com.jas.aop.Person;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication(scanBasePackages = "com.jas")
public class SpringbootApplication {

    public static void main(String[] args) throws Exception{

        ConfigurableApplicationContext context = SpringApplication.run(SpringbootApplication.class, args);

        Person person = context.getBean(Person.class);
        person.sayHi();

        System.out.println(person.getClass());
    }
}

啟動入口類輸出
這裡寫圖片描述

三、Spring Boot AOP 兩種動態代理方式

動態代理方式概述:

AOP 的原始碼中用到了兩種動態代理來實現攔截切入功能:JDK 動態代理和CGLIB 動態代理。兩種方式各有優劣。

JDK 動態代理是由java 內部的反射機制來實現的,CGLIB 動態代理底層則是藉助asm 來實現的。總的來說,反射機制在生成類的過程中比較高效,而asm 在生成類之後的相關執行過程中比較高效(可以通過將asm 生成的類進行快取,這樣解決asm 生成類過程低效問題)。

還有一點必須注意:JDK 動態代理的應用前提,必須是目標類基於統一的介面。如果沒有上述前提,JDK 動態代理不能應用。由此可以看出,JDK 動態代理有一定的侷限性,CGLIB 這種第三方類庫實現的動態代理應用更加廣泛,且在效率上更有優勢。。

關於JDK 動態代理知識,可參考博文:JDK 動態代理
但是從上面的輸出來看使用的是基於CGLIB 的代理方式,因為JDK 的動態代理類必須是實現了介面的類。下面寫一個介面類來測試一下。

動態代理方式演示:

在全域性配置檔案中配置代理方式,true 表示使用CGLIG,false 表示使用JDK 動態代理。
需要注意的是,當為false 時,如果代理類沒有實現介面,則使用的也是基於CGLIB 的動態代理。

spring.aop.proxy-target-class=false

Animal 介面

package com.jas.aop;

public interface Animal {
    void yell();
}

Dog 類

package com.jas.aop;

import org.springframework.stereotype.Component;

@Component
public class Dog implements Animal{

    @Override
    public void yell() {
        System.out.println("wang wang ...");
    }
}

在入口類加上對應的程式碼

System.out.println(context.getBean(Animal.class).getClass());

輸出
這裡寫圖片描述

相關推薦

Spring Boot 整合AOP

在這裡多談一些關於AOP 方面的知識,如果你對AOP 方面的知識比較熟悉,可以直接略過這個段落,往下看。 一、AOP概述 AOP(面向切面程式設計) 概念:這種在執行時,動態地將程式碼切入到類的指定方法、指定位置上的程式設計思想就是面向切面的程式設計。

Spring Boot2(六):使用Spring Boot整合AOP面向切面程式設計

一、前言 眾所周知,spring最核心的兩個功能是aop和ioc,即面向切面和控制反轉。本文會講一講SpringBoot如何使用AOP實現面向切面的過程原理。 二、何為aop ​ aop全稱Aspect Oriented Programming,面向切面,AOP主要實現的目的是針對業務處理過程中的切面進行提取

spring-boot整合dubbo:Spring-boot-dubbo-starter

hub pack 自動配置 china end service get exceptio 整合 為什麽要寫這個小工具 如果你用過Spring-boot來提供dubbo服務,相信使用中有很多“不爽”的地方。既然使用spring boot,那麽能用註解的地方絕不用xml配置,這

Spring Boot 整合 Elasticsearch,實現 function score query 權重分查詢

search 小寫 業務 jpg 啟動會 last cti cal agen 摘要: 原創出處 www.bysocket.com 「泥瓦匠BYSocket 」歡迎轉載,保留摘要,謝謝! 『 預見未來最好的方式就是親手創造未來 – 《史蒂夫·喬布斯

Spring Boot學習——AOP編程的簡單實現

col .com tsig 訪問 pan -s ping 編程範式 lan 首先應該明白一點,AOP是一種編程範式,是一種程序設計思想,與具體的計算機編程語言無關,所以不止是Java,像.Net等其他編程語言也有AOP的實現方式。AOP的思想理念就是將通用邏輯

spring boot整合mybatis深坑之c3p0的詳細配置

text context ati reat source ast type fig oot 項目地址:https://gitee.com/zhangjunqing/spring-boot/tree/master/springboot-mybatis-notice 本人在c3

spring boot整合swagger ui (RESTFUL接口的文檔在線自動生成+功能測試功能軟件,前後端分離快速開發)

oot images user builder img iop spi update and swagger ui可以通過來攔截controller層,生成請求API,並將其展示在瀏覽器當中。我們可以直接通過瀏覽器來查看和調試接口。 1 添加maven依賴

Spring boot整合jsp

jstl標簽庫 中學 encoding 正常 group lan 名稱 free vax   這幾天在集中學習Spring boot+Shiro框架,因為之前view層用jsp比較多,所以想在spring boot中配置jsp,但是spring boot官方不推薦使用jsp

spring boot 整合mybatis

參考 plugins odin system stack name incr xmlns xsd 參考: http://blog.csdn.net/saytime/article/details/74783296 spring boot可以使用全註解的方式進行開發,極大的提

spring boot整合mybatis+mybatis-plus

可靠 nic false system ttr .post 代碼生成 -i filters Spring boot對於我來說是一個剛接觸的新東西,學習過程中,發現這東西還是很容易上手的,Spring boot沒配置時會默認使用Spring data jpa,這東西可以說一個

spring boot整合quartz定時任務案例

blank pos jdk com post 4.0 learn int idea 1.運行環境 開發工具:intellij idea JDK版本:1.8 項目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/spr

Spring-Boot整合freemarker引入靜態資源css、js等(轉)

mark pan 創建 line path main 實現 content -m 一、概述springboot 默認靜態資源訪問的路徑為:/static 或 /public 或 /resources 或 /META-INF/resources 這樣的地址都必須定義在src/

Spring Bootaop中獲取request對象

stat class gpo thold t對象 對象 pat ring before doBefore(){ ServetRequestAttrbtes attributes = (ServetRequestAttrbtes)RequestContextHolder.

企業分布式微服務雲SpringCloud SpringBoot mybatis (十三)Spring Boot整合MyBatis

ech 字段 osc 操作 with public assert 連接 ref Spring中整合MyBatis就不多說了,最近大量使用Spring Boot,因此整理一下Spring Boot中整合MyBatis的步驟。搜了一下Spring Boot整合MyBatis的文

Spring Boot整合MyBatis學習總結

Spring Boot MyBatis druid數據源 druid sql監控 公司的很多項目都陸陸續續引入了Spring Boot,通過對Spring Boot的接觸了解發現其真的是大大地簡化了開發、簡化了依賴配置,很多功能註解一下就可以實現,真的是太方便了。下面記錄了一個Sp

Spring boot 整合spring Data JPA+Spring Security+Thymeleaf框架(上)

current 不可 src rac 分享圖片 正在 html AC ren 近期上班太忙所以耽擱了給大家分享實戰springboot 框架的使用。 以下是spri

spring boot 整合 activiti springMVC

pri family 輸入 fig AR https framework top public 解決Springboot集成ActivitiModel提示輸入密碼的問題: 在springboot啟動類中增加如下代碼: @SpringBootApplication @Enab

spring boot 系列之三:spring boot 整合JdbcTemplate

closed com context boot pin pan url wired ace 前面兩篇文章我們講了兩件事情: 通過一個簡單實例進行spring boot 入門 修改spring boot 默認的服務端口號和默認context path 這篇文章我們來看下怎

spring boot 系列之四:spring boot 整合JPA

rom prop pos output UNC actor href ali div 上一篇我們講了spring boot 整合JdbcTemplate來進行數據的持久化, 這篇我們來說下怎麽通過spring boot 整合JPA來實現數據的持久化。 一、代碼實現  修改

spring boot 整合pagehelper分頁插件

.com 2.0 configure deb sta pub 相關 spring 整合 Spring Boot 整合pagehelper分頁插件 測試環境: spring boot 版本 2.0.0.M7 mybatis starter 版本 1.3.1 jdk 1.8