好程式設計師Java分享Spring框架之AOP的基本配置
好程式設計師 Java 分享 Spring 框架之 AOP 的基本配置, 前言 我們在前面學習了動態代理機制, Spring 的 AOP 正是應用此機制實現的,下面我們來學習如何來配置 Spring AOP ,實現基本的功能。
什麼是 AOP
AOP ( Aspect Oriented Programming )面向切面程式設計,是 OOP (物件導向程式設計)的重要補充,物件導向是 Java 程式設計的基礎,以封裝、繼承、多型建立了物件間的層次關係,關注的是每個物件的具體實現。物件導向允許我們開發縱向的關係。
AOP 關注橫向關係,也就是說類和類之間不需要特定的關係,它能夠將某些通用的操作(如:日誌處理、安全驗證、事務處理、異常處理、效能統計等)插入到這些無關的類中,從而可以讓每個類只關注自己的核心邏輯,不必處理這些通用的操作,這個過程就是橫切,而這些通用的操作就是切面 Aspect 。
簡單來說: AOP 能把和類的核心業務無關,多個類又共同需要的邏輯程式碼封裝起來,當物件需要時自動呼叫,這樣就減少了類中的重複程式碼,降低了類之間的耦合性,提高了程式的維護性 。
AOP 術語
1 、橫切關注點
對哪些方法進行攔截,攔截後怎麼處理,這些關注點稱之為橫切關注點
2 、切面( aspect )
類是對物體特徵的抽象,切面就是對橫切關注點的抽象
3 、連線點( joinpoint )
被攔截到的點,因為 Spring 只支援方法型別的連線點,所以在 Spring 中連線點指的就是被攔截到的方法,實際上連線點還可以是欄位或者構造器
4 、切入點( pointcut )
對連線點進行攔截的定義
5 、通知( advice )
所謂通知指的就是指攔截到連線點之後要執行的程式碼,通知分為前置、後置、異常、最終、環繞通知五類
6 、目標物件
代理的目標物件
7 、織入( weave )
將切面應用到目標物件並導致代理物件建立的過程
8 、引入( introduction )
在不修改程式碼的前提下,引入可以在執行期為類動態地新增一些方法或欄位
AOP 應用場景
1 )日誌 ,方法執行開始和完成以及出現異常都可以用日誌記錄
2 )快取 ,第一次呼叫查詢資料庫,將查詢結果放入記憶體物件, 第二次呼叫, 直接從記憶體物件返回,不需要查詢資料庫
3 )事務 ,呼叫方法前開啟事務, 呼叫方法後提交關閉事務
等等
AOP 的配置
1 )匯入 Maven 依賴
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.14.Release</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<!-- -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.13</version>
</dependency>
<!-- -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
編寫 Service 介面和實現類,這裡只完成模擬操作
public interface AdminService {
void saveAdmin();
void updateAdmin();
void deleteAdmin();
void selectAdmin();
}
public class AdminServiceImpl implements AdminService {
@Override
public void saveAdmin() {
System.out.println("Invoke saveAdmin");
}
@Override
public void updateAdmin() {
System.out.println("Invoke updateAdmin");
}
@Override
public void deleteAdmin() {
System.out.println("Invoke deleteAdmin");
}
@Override
public void selectAdmin() {
System.out.println("Invoke selectAdmin");
}
}
3 )編寫自定義增強類,該類的方法對應 AOP 的 5 種增強通知,分別是:
1 ) 前置通知 before :方法呼叫前執行
2 ) 後置通知 after-returning :方法呼叫後執行,出現異常不執行
3 ) 後置通知 after :方法呼叫後執行,出現異常也執行
4 ) 異常通知 after-throwing :出現異常執行
5 ) 環繞通知 around :方法呼叫前後執行
/**
* 自定義增強類
*/
public class MyAdvise {
public void before() throws Throwable {
System.out.println(" 這是 before");
}
public void afterReturning(){
System.out.println(" 這是 afterReturning");
}
public void after(){
System.out.println(" 這是 after");
}
public void afterThrowing() throws Throwable {
System.out.println(" 這是 afterThrowing");
}
public Object around(ProceedingJoinPoint point) throws Throwable {
System.out.println(" 這是 around -- 前置執行 ");
Object obj = point.proceed();
System.out.println(" 這是 around -- 後置執行 ");
return obj;
}
}
4) Spring 配置檔案
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="
xmlns:xsi="
xmlns:aop="
xsi:schemaLocation="
/spring-beans.xsd
/spring-aop.xsd">
<bean id="userService" class="com.qianfeng.springaop.UserServiceImpl"/>
<bean id="adminService" class="com.qianfeng.springaop.AdminServiceImpl"/>
<bean id="myAdvise" class="com.qianfeng.springaop.MyAdvise"/>
<aop:config>
<!-- 配置切入點
execution 中第一個 * 代表任意返回值型別,後面是包名,第二個 * 代表類名的開頭,第三個 * 代表任意方法, (..) 代表任意方法引數
-->
<aop:pointcut id="c" expression="execution(* com.qianfeng.springaop.*ServiceImpl.*(..))"/>
<!-- 配置方面 -->
<aop:aspect ref="myAdvise">
<aop:before method="before" pointcut-ref="c"/>
<aop:after method="after" pointcut-ref="c"/>
<aop:after-returning method="afterReturning" pointcut-ref="c"/>
<aop:after-throwing method="afterThrowing" pointcut-ref="c"/>
<aop:around method="around" pointcut-ref="c"/>
</aop:aspect>
</aop:config>
</beans>
5 )執行測試
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext-aop.xml")
public class TestAOP {
@Test
public void test(){
ApplicationContext app = new
ClassPathXmlApplicationContext("applicationContext-aop.xml");
AdminService as = (AdminService) app.getBean("adminService");
as.deleteAdmin();
}
}
可以看到執行任何 Service 類的方法,都會呼叫 MyAdvise 中的通知方法
總結
本章我們學習了 Spring AOP 的配置,首先需要新增通知增強類,可以新增前置、後置或環繞等通知方法來完成某些通用操作,然後再 Spring 的配置檔案中配置切入點,最後是配置切面,將通知類中的方法和切面中的方法進行繫結,最後呼叫 Java 物件的方法時,就能看到 AOP 的效果。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2651769/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師java分享spring框架精講程式設計師JavaSpring框架
- 好程式設計師Java乾貨分享Spring框架之IOC原理程式設計師JavaSpring框架
- 好程式設計師Java教程分享javaweb框架程式設計師JavaWeb框架
- 好程式設計師Java學習路線之SpringMVC之基本配置程式設計師JavaSpringMVC
- 好程式設計師Java教程分享Java之設計模式程式設計師Java設計模式
- 好程式設計師Java學習路線分享MyBatis之基本使用程式設計師JavaMyBatis
- 好程式設計師Java教程分享幾個流行的Java框架程式設計師Java框架
- 好程式設計師Java學習路線分享MyBatis之Spring整合程式設計師JavaMyBatisSpring
- 好程式設計師Java教程分享Java開發主流框架程式設計師Java框架
- 好程式設計師Java培訓分享Spring Ioc的原理程式設計師JavaSpring
- 好程式設計師Java學習路線之Spring框架之動態代理程式設計師JavaSpring框架
- 好程式設計師分享java設計模式之享元模式程式設計師Java設計模式
- 好程式設計師Java分享SpringMVC之@ResponseBody註解程式設計師JavaSpringMVC
- 好程式設計師Java培訓分享Java程式設計技巧程式設計師Java
- 好程式設計師Java教程分享Java面試題之Hibernate程式設計師Java面試題
- 好程式設計師Java培訓分享Java之反射技術程式設計師Java反射
- 好程式設計師Java培訓分享Java的三大框架怎麼學?程式設計師Java框架
- 好程式設計師Java教程分享Vue外掛之Axios程式設計師JavaVueiOS
- 好程式設計師Java分享MySQL之SQL入門(一)程式設計師JavaMySql
- 好程式設計師Java學習路線分享Java框架怎麼搭建程式設計師Java框架
- 好程式設計師Java培訓分享Java程式設計師技能提升指南程式設計師Java
- 好程式設計師Java培訓分享SpringBoot -自動配置原理程式設計師JavaSpring Boot
- 好程式設計師Java培訓分享Java程式設計師常用的工具類庫程式設計師Java
- 好程式設計師Java培訓分享Java讀寫Properties配置檔案程式設計師Java
- 好程式設計師Java教程分享Java難點解析之泛型程式設計師Java泛型
- 好程式設計師Java教程分享Java語法程式設計師Java
- 好程式設計師Java教程分享Servlet基本概念以及執行流程程式設計師JavaServlet
- 好程式設計師Java教程分享List介面程式設計師Java
- 好程式設計師Java教程分享面試中Spring的技術問題程式設計師Java面試Spring
- 好程式設計師分享Java面試題:物件導向的四個基本特徵程式設計師Java面試題物件特徵
- 好程式設計師Java教程分享Java之包裝類與常用類程式設計師Java
- 好程式設計師Java培訓分享BigDecimal的用法程式設計師JavaDecimal
- 好程式設計師Java培訓分享20個Java程式設計師基礎題程式設計師Java
- 好程式設計師Java教程分享Java面試妙招程式設計師Java面試
- 好程式設計師Java教程分享Java開發工具程式設計師Java
- Spring之AOP面向切面程式設計Spring程式設計
- 好程式設計師Java培訓分享之RMI與RPC的區別程式設計師JavaRPC
- 好程式設計師Java培訓分享22道Spring Boot面試題!程式設計師JavaSpring Boot面試題