首頁  >  文章  >  Java  >  SpringBoot整合Web之AOP怎麼配置

SpringBoot整合Web之AOP怎麼配置

WBOY
WBOY轉載
2023-05-18 18:47:27849瀏覽

配置AOP

AOP簡介

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

  • 連接點是指類別中可以被增強的方法。例如,想要修改那個方法的功能,那麼該方法就是一個連接點

  • 切入點(Pointcut)是指定義對連接點(Joinpoint)進行攔截的操作。這個定義是指攔截所有以 insert 開始的方法作為切入點

  • 在攔截到 Joinpoint 之後,要執行的操作是發送通知。例如,之前說到的列印日誌監控。通知分為前置通知、後置通知、例外通知、最終通知、環繞通知

  • Aspect(切面):Pointcut 與Advice 的組合

  • ##Target(目標物件):要增強的類別成為Target

Spring Boot 支援

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

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

然後在com.sang.aop.service 包下創建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...");
    }
}

然後創建切面,如下:

@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 + "方法开始执行...");
    }
    @After(value = "pc1()")
    public void after(JoinPoint jp) {
        String name = jp.getSignature().getName();
        System.out.println(name + "方法执行结束...");
    }
    @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 註解顯示這是一個切面類別

  • ##@Pointcut( ) annotation is used in the method pc1() to define a pointcut.。 execution 中的第一個* 表示方法傳回任意值,第二個* 表示service 套件下的任意類,第三個* 表示類別中的任意方法,括號中的兩個點表示方法參數任意,即這裡描述的切入點為service 套件下所有類別中的所有方法
  • before() 方法使用了@Before註解,表示這是一個前置通知,該方法在目標方法執行之前執行。 JoinPoint 參數可提供有關目標方法的名稱、修飾符及其他資訊
  • after() 方法使用了@After註解,表示這是一個後置通知,該方法在目標方法執行之後執行
  • afterReturning() 方法使用了@AfterReturning 註解,表示這是一個回傳通知,在該方法中可以取得目標方法的回傳值。 @AfterReturning 註解中的 returning 參數表示與方法參數對應的回傳值的變數名稱。請注意,在方法參數中定義了result 的類型為Object ,表示目標方法的傳回值可以使任意類型,若result 參數的類型為Long ,則該方法只能處理目標方法傳回值為Long 的情況
  • afterThrowing() 方法使用了@AfterThrowing 註解,表示這是一個異常通知,即當目標方法發生異常時,該方法會被調用,異常類型為Exception 表示所有的異常都會進入該方法中執行,若異常類型為ArithmeticException ,則表示只有目標方法拋出ArithmeticException 異常時才會進入該方法處理
  • 這段話的重寫版本: 使用 @Around 註解的 around() 方法稱為環繞通知。環繞通知擁有所有通知中最強大的功能,它可以實現前置通知、後置通知、異常通知以及返回通知。目標方法進入環繞通知後,透過呼叫ProceedingJoinPoint 物件的proceed 方法使目標方法繼續執行,開發者可以在此修改目標方法的執行參數、傳回值等,並且可以在此處理目標方法的例外狀況
  • 配置完成後,接下來在Controller 中建立接口,分別呼叫Userservice 中的兩個方法,即可看到LogAspect 中的程式碼動態的嵌入目標方法中執行了,如下:

getUserById方法開始執行...
get...

getUserById方法傳回值為:user
getUserById方法執行結束...
deleteUserById方法開始執行...
delete...
deleteUserById方法傳回值為:null
deleteUserById方法執行結束...

其它

自訂歡迎頁

Spring Boot 專案在啟動後,首先會去靜態資源路徑下查找index.html 作為首頁文件,若查找不到,則會去查找動態的index.html 作為首頁文件。

例如,如果想使用静态的 index.html 页面作为项目的首页,只需在 resources/static 目录下创建 index.html 文件疾苦。若想使用动态页面作为项目首页,则需在 resources/templages 目录下创建 index.html (使用Thymeleaf 模板) 或者 index.ftl(使用 FreeMarker 模板),然后在 Controller 中返回逻辑视图名,如下:

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

运行项目,输入"http://localhost:8081",查看结果

SpringBoot整合Web之AOP怎麼配置

自定义 favicon

favicon.ico 是浏览器选项卡左上角的图标,可以放在静态资源路径下或者类路径下,静态资源路径下的 favicon.ico 优先级高于类路径下的 favicon.ico

可以使用在线转换网站:https://www.bitbug.net/ 将一张普通图片转为 .ico 图片,转换成功后,将文件重命名为 favicon.ico ,然后复制到 resources/static 目录下,如图

SpringBoot整合Web之AOP怎麼配置

启动项目,查看效果

SpringBoot整合Web之AOP怎麼配置

注意:清缓存,然后 Ctrl+F5 强制刷新

除去某个自动配置

Spring Boot 中提供了大量的自动化配置类,在 Spring Boot 的入口类上有一个 @SpringBootApplication 注解。该注解是一个组合注解,由 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan 组成,其中 @EnableAutoConfiguration 注解开启自动化配置,相关的自动化配置就会被使用。要移除某个自动化配置,开发者可以按照以下方法进行相应的配置更改

@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 目录下创建 4xx.htnl、5xx.html ,访问出错时就不会自动跳转了。由于 @EnableAutoConfiguration 注解的 exclude 属性值是一个数组,因此有多个要排除的自动化配置文件只需要继续添加即可。另外一种配置方法是在 application.properties 文件中进行配置,示例如下:

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

添加前

SpringBoot整合Web之AOP怎麼配置

添加后

SpringBoot整合Web之AOP怎麼配置

以上是SpringBoot整合Web之AOP怎麼配置的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除