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

SpringBoot整合Web之AOP配置詳解

 更新時間:2022年08月15日 11:28:56   作者:一只小熊貓呀  
面向切面編程(aspect-oriented programming,AOP)主要實現(xiàn)的目的是針對業(yè)務(wù)處理過程中的切面進行提取,諸如日志、事務(wù)管理和安全這樣的系統(tǒng)服務(wù),從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發(fā)的效率

配置AOP

AOP簡介

要介紹面向切面變成(Aspect-Oriented Programming,AOP),需要先考慮一個這樣的場景:公司有一個人力資源管理系統(tǒng)目前已經(jīng)上線,但是系統(tǒng)運行不穩(wěn)定,有時運行的很慢,為了檢測到底是哪個環(huán)節(jié)出現(xiàn)問題了,開發(fā)人員想要監(jiān)控每一個方法執(zhí)行的時間,再根據(jù)這些執(zhí)行時間判斷出問題所在。當問題解決后,再把這些監(jiān)控移除掉。系統(tǒng)目前已經(jīng)運行,如果手動修改系統(tǒng)成千上萬個方法,工作量太大,而且這些監(jiān)控方法以后還要移除掉;如果能夠在系統(tǒng)運行過程中動態(tài)添加代碼,就能很好的解決問題。這種在系統(tǒng)運行時動態(tài)添加代碼的方式成為面向切面編程(AOP)。Spring Boot 對 AOP 提供了很好的支持。在 AOP 中,有一些常見的概念需要了解:

  • Joinpoint(連接點):類里面可以被增強的方法即為連接點。例如,想修改那個方法的功能,那么該方法就是一個連接點
  • Pointcut(切入點):對 Joinpoint 進行攔截的定義即為切入點。例如,攔截所有以 insert 開始的方法,這個定義即為切入點
  • Advice(通知):攔截到 Joinpoint 之后所要做的事情就是通知。例如,之前說到的打印日志監(jiān)控。通知分為前置通知、后置通知、異常通知、最終通知、環(huán)繞通知
  • Aspect(切面):Pointcut 和 Advice 的結(jié)合
  • Target(目標對象):要增強的類成為 Target

Spring Boot 支持

Spring Boot 在 Spring 的基礎(chǔ)上對 AOP 的配置提供了自動化配置解決方案 spring-boot-starter-aop ,首先引入依賴,如下:

<!--    AOP 依賴    -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

然后在com.sang.aop.service 包下創(chuàng)建 UserService 類,如下:

@Service
public class UserService {
    public String getUserById(Integer id){
        System.out.println("get...");
        return "user";
    }
    public void deleteUserById(Integer id){
        System.out.println("delete...");
    }
}

然后創(chuàng)建切面,如下:

@Component
@Aspect
public class LogAspect {
    @Pointcut("execution(* com.sang.aop.service.*.*(..))")
    public void pc1() {
    }
    @Before(value = "pc1()")
    public void before(JoinPoint jp) {
        String name = jp.getSignature().getName();
        System.out.println(name + "方法開始執(zhí)行...");
    }
    @After(value = "pc1()")
    public void after(JoinPoint jp) {
        String name = jp.getSignature().getName();
        System.out.println(name + "方法執(zhí)行結(jié)束...");
    }
    @AfterReturning(value = "pc1()", returning = "result")
    public void afterReturning(JoinPoint jp, Object result) {
        String name = jp.getSignature().getName();
        System.out.println(name + "方法返回值為:" + result);
    }
    @AfterThrowing(value = "pc1()",throwing = "e")
    public void afterThrowing(JoinPoint jp, Exception e) {
        String name = jp.getSignature().getName();
        System.out.println(name+"方法拋異常了,異常是:"+e.getMessage());
    }
    @Around("pc1()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        return pjp.proceed();
    }
}

代碼解釋:

  • @Aspect 注解表明這是一個切面類
  • pc1() 方法使用了 @Pointcut() 注解 ,這是一個切入點定義。execution 中的第一個 * 表示方法返回任意值,第二個 * 表示 service 包下的任意類,第三個 * 表示類中的任意方法,括號中的兩個點表示方法參數(shù)任意,即這里描述的切入點為 service 包下所有類中的所有方法
  • before() 方法使用了 @Before注解 ,表示這是一個前置通知,該方法在目標方法執(zhí)行之前執(zhí)行。通過 JoinPoint 參數(shù)可以獲取目標方法的方法名、修飾符等信息
  • after() 方法使用了 @After注解,表示這是一個后置通知,該方法在目標方法執(zhí)行之后執(zhí)行
  • afterReturning() 方法使用了 @AfterReturning 注解,表示這是一個返回通知,在該方法中可以獲取目標方法的返回值。@AfterReturning 注解的 returning 參數(shù)是指返回值的變量名,對應(yīng)方法的參數(shù)。注意,在方法參數(shù)中定義了 result 的類型為 Object ,表示目標方法的返回值可以使任意類型,若 result 參數(shù)的類型為 Long ,則該方法只能處理目標方法返回值為 Long 的情況
  • afterThrowing() 方法使用了 @AfterThrowing 注解,表示這是一個異常通知,即當目標方法發(fā)生異常時,該方法會被調(diào)用,異常類型為 Exception 表示所有的異常都會進入該方法中執(zhí)行,若異常類型為 ArithmeticException ,則表示只有目標方法拋出 ArithmeticException 異常時才會進入該方法處理
  • around() 方法使用了 @Around 注解,表示這是一個環(huán)繞通知。環(huán)繞通知是所有通知里功能最為強大的通知,可以實現(xiàn)前置通知、后置通知、異常通知以及返回通知的功能。目標方法進入環(huán)繞通知后,通過調(diào)用 ProceedingJoinPoint 對象的 proceed 方法使目標方法繼續(xù)執(zhí)行,開發(fā)者可以在此修改目標方法的執(zhí)行參數(shù)、返回值等,并且可以在此處理目標方法的異常

配置完成后,接下來在Controller 中創(chuàng)建接口,分別調(diào)用 Userservice 中的兩個方法,即可看到 LogAspect 中的代碼動態(tài)的嵌入目標方法中執(zhí)行了,如下:

getUserById方法開始執(zhí)行...
get...
getUserById方法返回值為:user
getUserById方法執(zhí)行結(jié)束...
deleteUserById方法開始執(zhí)行...
delete...
deleteUserById方法返回值為:null
deleteUserById方法執(zhí)行結(jié)束...

其它

自定義歡迎頁

Spring Boot 項目在啟動后,首先會去靜態(tài)資源路徑下查找 index.html 作為首頁文件,若查找不到,則會去查找動態(tài)的 index.html 作為首頁文件。

例如,如果想使用靜態(tài)的 index.html 頁面作為項目的首頁,只需在 resources/static 目錄下創(chuàng)建 index.html 文件疾苦。若想使用動態(tài)頁面作為項目首頁,則需在 resources/templages 目錄下創(chuàng)建 index.html (使用Thymeleaf 模板) 或者 index.ftl(使用 FreeMarker 模板),然后在 Controller 中返回邏輯視圖名,如下:

@Controller
public class IndexController {
    @RequestMapping("/index")
    public String index(){
        return "index";
    }
}

運行項目,輸入"http://localhost:8081",查看結(jié)果

自定義 favicon

favicon.ico 是瀏覽器選項卡左上角的圖標,可以放在靜態(tài)資源路徑下或者類路徑下,靜態(tài)資源路徑下的 favicon.ico 優(yōu)先級高于類路徑下的 favicon.ico

可以使用在線轉(zhuǎn)換網(wǎng)站:https://www.bitbug.net/ 將一張普通圖片轉(zhuǎn)為 .ico 圖片,轉(zhuǎn)換成功后,將文件重命名為 favicon.ico ,然后復(fù)制到 resources/static 目錄下,如圖

啟動項目,查看效果

注意:清緩存,然后 Ctrl+F5 強制刷新

除去某個自動配置

Spring Boot 中提供了大量的自動化配置類,在 Spring Boot 的入口類上有一個 @SpringBootApplication 注解。該注解是一個組合注解,由 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan 組成,其中 @EnableAutoConfiguration 注解開啟自動化配置,相關(guān)的自動化配置就會被使用。如果開發(fā)者不想使用某個自動化配置,按如下方式除去相關(guān)配置即可:

@SpringBootApplication
@EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class})
public class Chapter04Application {
    public static void main(String[] args) {
        SpringApplication.run(Chapter04Application.class, args);
    }
}

在 @EnableAutoConfiguration 注解中使用 exclude 屬性去除 Error 的自動化配置類,這時如果在 resources/static/error 目錄下創(chuàng)建 4xx.htnl、5xx.html ,訪問出錯時就不會自動跳轉(zhuǎn)了。由于 @EnableAutoConfiguration 注解的 exclude 屬性值是一個數(shù)組,因此有多個要排除的自動化配置文件只需要繼續(xù)添加即可。除了這種配置方式外,也可在 application.properties 中配置,如下:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration

添加前

添加后

到此這篇關(guān)于SpringBoot整合Web之AOP配置詳解的文章就介紹到這了,更多相關(guān)SpringBoot AOP配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java設(shè)計模式中橋接模式應(yīng)用詳解

    Java設(shè)計模式中橋接模式應(yīng)用詳解

    橋接,顧名思義,就是用來連接兩個部分,使得兩個部分可以互相通訊。橋接模式將系統(tǒng)的抽象部分與實現(xiàn)部分分離解耦,使他們可以獨立的變化。本文通過示例詳細介紹了橋接模式的原理與使用,需要的可以參考一下
    2022-11-11
  • spring實現(xiàn)bean對象創(chuàng)建代碼詳解

    spring實現(xiàn)bean對象創(chuàng)建代碼詳解

    這篇文章主要介紹了spring實現(xiàn)bean對象創(chuàng)建代碼詳解,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12
  • 在Android系統(tǒng)中解析XML文件的方法

    在Android系統(tǒng)中解析XML文件的方法

    這篇文章主要介紹了在Android系統(tǒng)中解析XML文件的方法,利用Java寫成的XmlPullParser解析器,需要的朋友可以參考下
    2015-07-07
  • 高并發(fā)系統(tǒng)的限流詳解及實現(xiàn)

    高并發(fā)系統(tǒng)的限流詳解及實現(xiàn)

    這篇文章主要介紹了高并發(fā)系統(tǒng)的限流詳解及實現(xiàn),內(nèi)容詳細,小編覺得很不錯,這里分享給大家,供需要的朋友參考。隨小編一起看看吧。
    2017-11-11
  • springmvc json類型轉(zhuǎn)換錯誤解決方案

    springmvc json類型轉(zhuǎn)換錯誤解決方案

    這篇文章主要介紹了springmvc json類型轉(zhuǎn)換錯誤解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Java類的加載連接和初始化實例分析

    Java類的加載連接和初始化實例分析

    這篇文章主要介紹了Java類的加載連接和初始化,結(jié)合具體實例形式分析了java類的加載、連接、初始化相關(guān)原理與實現(xiàn)技巧,需要的朋友可以參考下
    2019-07-07
  • Java利用Swagger2自動生成對外接口的文檔

    Java利用Swagger2自動生成對外接口的文檔

    這篇文章主要介紹了Java利用Swagger2自動生成對外接口的文檔,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Java導(dǎo)入導(dǎo)出csv格式文件完整版詳解(附代碼)

    Java導(dǎo)入導(dǎo)出csv格式文件完整版詳解(附代碼)

    在Java中你可以使用不同的庫來導(dǎo)出CSV格式的文件,這篇文章主要給大家介紹了關(guān)于Java導(dǎo)入導(dǎo)出csv格式文件的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-07-07
  • Java System.exit()退出程序方式

    Java System.exit()退出程序方式

    這篇文章主要介紹了Java System.exit()退出程序方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • spring task 定時任務(wù)實現(xiàn)示例

    spring task 定時任務(wù)實現(xiàn)示例

    本篇文章主要介紹了spring task 定時任務(wù)實現(xiàn)示例,具有一定的參考價值,有興趣的可以了解一下。
    2017-01-01

最新評論

卓尼县| 五家渠市| 土默特右旗| 隆林| 文昌市| 永定县| 吐鲁番市| 云霄县| 永善县| 关岭| 故城县| 尚志市| 平邑县| 措勤县| 达日县| 志丹县| 巫山县| 张家界市| 娄底市| 新乡县| 伊吾县| 嘉峪关市| 石渠县| 双峰县| 德惠市| 陵水| 南投县| 沅陵县| 海阳市| 锡林浩特市| 三门县| 嘉义县| 绥阳县| 台州市| 和平区| 韶山市| 高唐县| 兴海县| 绩溪县| 台江县| 阳城县|