Spring之AOP實現
文章目錄
前言
AOP(Aspect Oriented Programming)稱為面向切面程式設計,在程式開發中主要用來解決一些系統層面上的問題,比如日誌,事務,許可權等待。
環境搭建
1、pom.xml 配置AOP依賴
<!-- AOP 依賴-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
2、Spring配置檔案的名稱空間中加入aop標頭檔案
<beans xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
前置業務類編寫
1、Admin的service
package com.ex.service;
public interface IAdminService {
public void saveAdmin(String name);
}
package com.ex.service.impl;
@Service
public class adminServiceImpl implements IAdminService {
@Override
public void saveAdmin(String name) {
System.out.println("save admin method");
}
}
2、user的service
package com.ex.service;
public interface IUserService {
public void selectUser(int id);
}
package com.ex.service.impl;
@Service
public class userServiceImpl implements IUserService {
@Override
public void selectUser(int id) {
System.out.println("user select method");
}
}
一、註解實現AOP
1.編寫註解實現的增強類
@Component
@Aspect
public class LogAdvice {
// springaop自動的5種aop這裡全部列出
// *返回型別,包名,*類名,*方法名,(..)任何引數
@Before("execution(* com.ex.service.impl.*.*(..))")
public void before(){
System.out.println("---------方法執行前before()---------");
}
@After("execution(* com.ex.service.impl.*.*(..))")
public void after(){
System.out.println("---------方法執行後after()---------");
}
@AfterReturning("execution(* com.ex.service.impl.*.*(..))")
public void afterReturning(){
System.out.println("---------方法返回後afterReturning()---------");
}
@Around("execution(* com.ex.service.impl.*.*(..))")
public void around(ProceedingJoinPoint jp) throws Throwable {
System.out.println("-------環繞前-------");
System.out.println("簽名(拿到方法名):"+jp.getSignature());
//執行目標方法proceed
Object proceed = jp.proceed();
System.out.println("-------環繞後------");
System.out.println(proceed);
}
@AfterThrowing("execution(* com.xinzhi.service.impl.*.*(..))")
public void afterThrow() {
System.out.println("--------------有異常發生-----------------" + new Date());
}
}
2.在Spring配置檔案中,註冊bean,並增加支援註解的配置
<!-- 掃包:如果使用了註解,需要在開始之前去掃包-->
<context:component-scan base-package="com.ex"/>
<!-- aop 註解實現 配置 -->
<aop:aspectj-autoproxy/>
3.測試
@Test
public void testAop(){
userService.selectUser(1);
System.out.println("--------------------------------");
adminService.saveAdmin("aa");
}
結果
-------環繞前-------
簽名(拿到方法名):void com.ex.service.IUserService.selectUser(int)
---------方法執行前before()---------
user select method
-------環繞後------
null
---------方法執行後after()---------
---------方法返回後afterReturning()---------
--------------------------------
-------環繞前-------
簽名(拿到方法名):void com.ex.service.IAdminService.saveAdmin(String)
---------方法執行前before()---------
save admin method
-------環繞後------
null
---------方法執行後after()---------
---------方法返回後afterReturning()---------
二、配置檔案實現AOP
1.編寫自定義增強類
public class MyAOP {
public void before(){
System.out.println("---------執行方法前列印日誌--------------自定義");
}
public void after(){
System.out.println("---------執行方法後列印日誌--------------自定義");
}
}
2.Spring配置檔案中,註冊bean,配置增強
<!--註冊bean-->
<bean id="myAop" class="com.xinzhi.aop.MyAop"/>
<!--aop的配置-->
<aop:config>
<!-- ref 自定義切面類 -->
<aop:aspect ref="myAOP">
<!-- 切入點配置 -->
<aop:pointcut id="pointcut1" expression="execution(* com.ex.service.impl.adminServiceImpl.*(..))"/>
<aop:pointcut id="pointcut2" expression="execution(* com.ex.service.impl.userServiceImpl.*(..))"/>
<!-- 織入 -->
<aop:before pointcut-ref="pointcut1" method="before"/>
<aop:after pointcut-ref="pointcut2" method="after"/>
</aop:aspect>
</aop:config>
2.測試
@Test
public void testAop2(){
userService.selectUser(1);
System.out.println("--------------------------------");
adminService.saveAdmin("aa");
}
結果
user select method
---------執行方法後列印日誌--------------自定義
--------------------------------
---------執行方法前列印日誌--------------自定義
save admin method
總結
AOP就是對指定的一批的方法在其執行過程中進行一個統一的處理,將大量重複性的工作抽離了出來,省事!
相關文章
- Spring框架系列(9) - Spring AOP實現原理詳解之AOP切面的實現Spring框架
- Spring——AOP實現Spring
- Spring框架系列(10) - Spring AOP實現原理詳解之AOP代理的建立Spring框架
- Spring系列之aAOP AOP是什麼?+xml方式實現aop+註解方式實現aopSpringXML
- Spring AOP實現原理Spring
- 【Spring】AOP實現原理Spring
- Spring框架系列(11) - Spring AOP實現原理詳解之Cglib代理實現Spring框架CGLib
- Spring框架系列(12) - Spring AOP實現原理詳解之JDK代理實現Spring框架JDK
- Spring系列之AOP的原理及手動實現Spring
- Spring AOP的實現原理Spring
- Spring AOP實現過程Spring
- spring-AOP(二)實現原理之AspectJ註解方式Spring
- spring-AOP(一)實現原理Spring
- Spring AOP 的實現機制Spring
- Spring AOP概述、底層實現Spring
- Spring核心思想之 AOP:在自定義容器基礎上實現AOP功能Spring
- Spring-AOP之工作實踐(二)Spring
- 死磕Spring之AOP篇 - Spring AOP總覽Spring
- Spring AOP學習筆記03:AOP的核心實現之獲取增強器Spring筆記
- Spring系列:基於Spring-AOP和Spring-Aspects實現AOP切面程式設計Spring程式設計
- Spring中通過Annotation來實現AOPSpring
- Spring Aop基於註解的實現Spring
- Spring AOP基於xml的方式實現SpringXML
- [轉載]Spring AOP的實現機制Spring
- Spring AOP實踐Spring
- Spring學習之——手寫Spring原始碼V2.0(實現IOC、DI、MVC、AOP)Spring原始碼MVC
- 死磕Spring之AOP篇 - Spring AOP自動代理(一)入口Spring
- 死磕Spring之AOP篇 - Spring AOP常見面試題Spring面試題
- Spring AOP 實現《自動自動填充Entity》Spring
- 理解Spring(二):AOP 的概念與實現原理Spring
- Spring基於註解實現 AOP 切面功能Spring
- Spring AOP之原始碼分析Spring原始碼
- Spring Boot之IOC&AOPSpring Boot
- 5.3 Spring5原始碼--Spring AOP使用介面方式實現Spring原始碼
- Spring Boot系列十八 Spring AOP + 註解實現統一註解Spring Boot
- spring boot使用Jedis整合Redis實現快取(AOP)Spring BootRedis快取
- Spring Aop實現資料庫讀寫分離Spring資料庫
- Spring AOP實現統一日誌輸出Spring