最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot集成AOP的代碼示例

 更新時間:2024年09月08日 08:23:27   作者:HBLOG  
AOP是一種編程范式,它旨在將橫切關注點(cross-cutting concerns)從應用程序的業(yè)務邏輯中分離出來,橫切關注點是那些在多個模塊中重復出現(xiàn)的功能,如日志記錄、性能監(jiān)控、事務管理、安全控制等,本文介紹了Spring Boot如何集成AOP,需要的朋友可以參考下

1.什么是AOP?

AOP(Aspect Oriented Programming,面向切面編程)是一種編程范式,它旨在將橫切關注點(cross-cutting concerns)從應用程序的業(yè)務邏輯中分離出來。橫切關注點是那些在多個模塊中重復出現(xiàn)的功能,如日志記錄、性能監(jiān)控、事務管理、安全控制等。AOP允許開發(fā)者將這些關注點模塊化,并在不影響應用程序主要功能的情況下,將它們編織到應用程序的各個點上。

AOP的關鍵概念

  • 切面(Aspect):封裝了橫切關注點的模塊。它描述了要執(zhí)行的附加行為以及該行為應該被應用到哪些連接點上。
  • 連接點(Joinpoint):程序執(zhí)行過程中的某個點,如方法調用或異常拋出。
  • 通知(Advice):切面在特定的連接點上執(zhí)行的動作,如“before”、“after”、“around”等。
  • 切入點(Pointcut):匹配連接點的表達式,定義了切面的哪個部分會被應用到哪些連接點上。
  • 目標對象(Target Object):被一個或多個切面所通知的對象。
  • 代理(Proxy):由AOP框架創(chuàng)建的對象,用來攔截目標對象上的方法調用。

AOP的實現(xiàn)方式

AOP可以通過以下幾種方式實現(xiàn):

  • 基于代理的AOP:
    • JDK動態(tài)代理:適用于實現(xiàn)接口的情況,利用反射機制生成代理類。
    • CGLIB:使用字節(jié)碼技術生成子類,適用于未實現(xiàn)接口的情況。
  • 基于字節(jié)碼操作的AOP:
    • AspectJ:在編譯期或運行期通過修改字節(jié)碼來實現(xiàn)切面的編織,可以更細粒度地控制切面的織入。
  • 聲明式AOP:
    • Spring AOP:使用XML配置或注解(如@Aspect@Before、@After@Around等)來定義切面和切入點,然后在運行時通過動態(tài)代理實現(xiàn)切面的編織。

實現(xiàn)AOP的關鍵技術

  • 動態(tài)代理:在運行時動態(tài)創(chuàng)建代理對象,代理對象在調用目標方法前后可以執(zhí)行額外的操作。
  • 字節(jié)碼操作庫:如ASM、ByteBuddy等,用于生成或修改字節(jié)碼,實現(xiàn)在類的加載之前或運行時修改類的行為。
  • 元數(shù)據(jù)驅動:使用注解或XML配置來定義切面、切入點和通知,便于配置和管理AOP的規(guī)則。

AOP的主要優(yōu)點是能夠減少業(yè)務邏輯中的重復代碼,提高代碼的模塊化程度,使得關注點更加集中,同時也提高了代碼的可維護性和可讀性。在實際應用中,AOP經常被用于企業(yè)級應用開發(fā),如在Spring框架中廣泛使用。

2.代碼工程

實驗目標

采用@aspect注解來實現(xiàn)aop

pom.xml

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springboot-demo</artifactId>
        <groupId>com.et</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>aspect</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>
       
    </dependencies>
</project>

controller

package com.et.aspect.controller;

import com.et.aspect.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
public class HelloWorldController {
    @Autowired
    TestService testService;


    @RequestMapping("/hello")
    public Map<String, Object> showHelloWorld(){
        Map<String, Object> map = new HashMap<>();
        String str=  testService.sayHello("liming");
        map.put("msg",str);
        return map;
    }
}

service

package com.et.aspect.service;

public interface TestService {
    public String sayHello(String name) ;
}

package com.et.aspect.service.impl;

import com.et.aspect.service.TestService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * @author liuhaihua
 * @version 1.0
 * @ClassName TestServiceImpl
 * @Description todo
 * @date 2024/09/05/ 9:21
 */
@Service
@Slf4j
public class TestServiceImpl implements TestService {
    @Override
    public String sayHello(String name) {
        String  sss="hello,"+name;
        log.info(sss);
        return sss;
    }
}

aspect

  • @Aspect:作用是把當前類標識為一個切面供容器讀取

  • @Pointcut:定義切入點,Pointcut是植入Advice的觸發(fā)條件。 每個Pointcut的定義包括2部分,一是表達式,二是方法簽名。方法簽名必須是 public及void型。 可以將Pointcut中的方法看作是一個被Advice引用的助記符,因為表達式不直觀,因此我們可以通過方法簽名的方式為 此表達式命名。 因此Pointcut中的方法只需要方法簽名,而不需要在方法體內編寫實際代碼。

  • @Around:環(huán)繞增強,相當于MethodInterceptor(方法攔截器)

  • @AfterReturning:后置增強,相當于AfterReturningAdvice,方法正常退出時執(zhí)行

  • @Before:標識一個前置增強方法,相當于BeforeAdvice的功能,相似功能的還有

  • @AfterThrowing:異常拋出增強,相當于ThrowsAdvice(異常通知)

  • @After: final增強,不管是拋出異?;蛘哒M顺龆紩?zhí)行

@Pointcut("execution(* com.et.aspect.service..*.*(..))")
public void aopPoint() {

}

@Before("aopPoint()")
public void doBefore(JoinPoint point) throws Throwable {
    log.info("before ....");
}
@After("aopPoint()")
public void doAfter(JoinPoint point) throws Throwable {
    log.info("after ....");
}

以上只是一些關鍵代碼,所有代碼請參見下面代碼倉庫

代碼倉庫

3.測試

  • 啟動Spring Boot應用程序

  • 訪問http://127.0.0.1:8088/hello

  • 查看日志如下

    2024-09-05 21:52:12.926 INFO 51009 --- [nio-8088-exec-1] com.et.aspect.aspect.TaskAspect : before .... 2024-09-05 21:52:12.939 INFO 51009 --- [nio-8088-exec-1] c.e.aspect.service.impl.TestServiceImpl : hello,liming 2024-09-05 21:52:12.939 INFO 51009 --- [nio-8088-exec-1] com.et.aspect.aspect.TaskAspect : after ....

以上就是Spring Boot集成AOP的代碼示例的詳細內容,更多關于Spring Boot集成AOP的資料請關注腳本之家其它相關文章!

相關文章

  • SpringBoot使用ApplicationEvent&Listener完成業(yè)務解耦

    SpringBoot使用ApplicationEvent&Listener完成業(yè)務解耦

    這篇文章主要介紹了SpringBoot使用ApplicationEvent&Listener完成業(yè)務解耦示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Java實現(xiàn)文件上傳和url格式校驗工具

    Java實現(xiàn)文件上傳和url格式校驗工具

    這篇文章主要介紹了如何使用Java實現(xiàn)文件上傳和url格式校驗工具,主要用于文件類型校驗,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2026-04-04
  • Logback配置文件這么寫,還說你不會整理日志?

    Logback配置文件這么寫,還說你不會整理日志?

    logback框架會默認加載classpath下命名為logback-spring.xml或logback.xml的配置文件。這篇文章主要介紹了Logback配置文件寫法,需要的朋友可以參考下
    2020-07-07
  • java實現(xiàn)登錄之后抓取數(shù)據(jù)

    java實現(xiàn)登錄之后抓取數(shù)據(jù)

    這篇文章給大家分享了用JAVA實現(xiàn)在登陸以后抓取網站的數(shù)據(jù)的相關知識,有興趣的朋友可以測試參考下。
    2018-07-07
  • 淺談C#與Java兩種語言的比較

    淺談C#與Java兩種語言的比較

    今天小編就為大家分享一篇關于淺談C#與Java兩種語言的比較,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • Java線程的全方位詳解

    Java線程的全方位詳解

    Java 給多線程編程提供了內置的支持。 一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務,多線程是多任務的一種特別的形式,但多線程使用了更小的資源開銷
    2021-10-10
  • java jackson 將對象轉json時,忽略子對象的某個屬性操作

    java jackson 將對象轉json時,忽略子對象的某個屬性操作

    這篇文章主要介紹了java jackson 將對象轉json時,忽略子對象的某個屬性操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Java日常練習題,每天進步一點點(5)

    Java日常練習題,每天進步一點點(5)

    下面小編就為大家?guī)硪黄狫ava基礎的幾道練習題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • JVM執(zhí)行引擎的項目實踐

    JVM執(zhí)行引擎的項目實踐

    執(zhí)行引擎是Java虛擬機核心的組成部分之一,本文主要介紹了JVM執(zhí)行引擎的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-04-04
  • java list與數(shù)組之間的轉換詳細解析

    java list與數(shù)組之間的轉換詳細解析

    以下是對java中l(wèi)ist與數(shù)組之間的轉換進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-09-09

最新評論

麟游县| 始兴县| 湛江市| 甘孜| 宁化县| 外汇| 正镶白旗| 磐石市| 莲花县| 凤冈县| 荔波县| 丰宁| 共和县| 西乌珠穆沁旗| 邹平县| 十堰市| 株洲县| 新郑市| 南昌县| 北票市| 仁布县| 乃东县| 郓城县| 清苑县| 汝州市| 航空| 团风县| 东乡| 镇远县| 体育| 彭泽县| 资中县| 长治市| 博白县| 莫力| 九江市| 安化县| 叙永县| 成安县| 中阳县| 上虞市|