1. 程式人生 > >Spring實戰學習3-面向切面的Spring

Spring實戰學習3-面向切面的Spring

1、什麼是面向切面程式設計

在軟體開發中,散佈於應用中多處的功能被稱為橫切關注點,它們從概念上是與應用的業務邏輯相分離的。把這些橫切關注點與業務邏輯相分離正是面向切面程式設計(AOP)所要解決的問題。[日誌、事務、安全和快取]

切面能夠幫助我們模組化橫切關注點。(橫切關注點可以描述為影響應用多處的功能),例如,安全就是一個橫切關注點,應用中的許多地方都會涉及到安全規則。

橫切關注點可以被模組化為特殊的類,這些類被稱為切面(aspect)
好處:
(1)每個橫切關注點都集中於一個地方,而不是分散到多處程式碼中
(2)服務模組更簡潔,只包含主要關注點的程式碼,而次要關注點的程式碼被轉移到切面中了。

1.1、AOP術語

描述切面的術語:通知(advice)、切點(pointcut)、連線點(join point)

1.1.1、通知:

切面的工作被稱為通知,它定義了切面是什麼以及何時使用。

Spring切面5中型別的通知

前置通知(Before):在目標方法被呼叫之前呼叫通知功能;
後置通知(After):在目標方法完成之後呼叫通知,此時不關心方法輸出是什麼。
返回通知(After-returning):在目標方法成功執行之後呼叫通知。
異常通知(After-throwing):在目標方法丟擲異常後呼叫通知;
環繞通知(Around):通知包裹了被通知的方法,在被通知的方法呼叫之前和呼叫之後執行自定義的行為。

1.1.2 連線點

連線點是在應用執行過程中能夠插入切面的一個點,這個點可以是呼叫方法、丟擲異常、修改一個欄位。切面程式碼可以利用這些點插入到應用的正常流程中。

1.1.3 切點

如果說通知定義了切面的什麼和何時的話,那麼切點就定義了何處。切點的定義會匹配通知所要織入的一個或多個連線點。通常使用明確的類和方法名稱,或是利用正則表示式定義所匹配的類和方法名稱來指定這些切點。

1.1.4 切面

切面是通知和切點的結合。通知和切點共同定義了切面的全部內容–它是什麼,在何時和何處完成其功能。

1.1.5織入

織入是把切面應用到目標物件並建立新的代理物件的過程。切面在指定的連線點被織入到目標物件中。

1.2 通過切點選擇連線點

切點用於準備定位應該在什麼地方應用切面的通知。通知和切面是切面的最基本元素。

在Spring AOP中,要使用AspectJ的切點表示式語言來定義切點。

1.2.1 編寫切點

先定義一個介面,為了定義切點使用

public interface Performance {
	
	public void perform();

}
//切點表示式
//execution():在方法執行時觸發
//** com.example.demo.springaop.Performance.perform(..):指定方法
//* :返回任意型別
//com.example.demo.springaop.Performance:方法所屬的類
//perform:方法
//..:使用任意引數
execution(** com.example.demo.springaop.Performance.perform(..))
1.2.2在切點中選擇bean

Spring引入了一個新的bean()指示器,它允許我們在切點表示式中使用bean的ID來標識bean。bean()使用bean ID或bean名稱作為引數來限制切點只匹配特定的bean。

execution(* com.example.demo.springaop.Performance.perform(..)) and bean('woodstock')
1.3 使用註解建立切面
1.3.1 定義切面
@Aspect
public class Audience {
	//前置通知
	@Before("execution(** com.example.demo.springaop.Performance.perform(..) )")
	public void silenceCellPhones() {
		System.out.println("silence cell phone");
	}
	//後置通知
	@After("execution(** com.example.demo.springaop.Performance.perform(..) )")
	public void takeSeats() {
		System.out.println("taking seats");
	}
	//後置通知
	@AfterReturning("execution(** com.example.demo.springaop.Performance.perform(..) )")
	public void applause() {
		System.out.println("calpca");
	}
	//後置失敗通知
	@AfterThrowing("execution(** com.example.demo.springaop.Performance.perform(..) )")
	public void demandRefund() {
		System.out.println("demand a refund");
	}

}

使用@Pointcut註解能夠在一個@AspectJ切面內定義可重用的切點

@Aspect
public class Audience {
	
	//定義命名的切點
	@Pointcut("execution(** com.example.demo.springaop.Performance.perform(..))")
	public void performance() {}
	
	//前置通知
	@Before("performance()")
	public void silenceCellPhones() {
		System.out.println("silence cell phone");
	}
	//後置通知
	@After("performance()")
	public void takeSeats() {
		System.out.println("taking seats");
	}
	//後置通知
	@AfterReturning("performance()")
	public void applause() {
		System.out.println("calpca");
	}
	//後置失敗通知
	@AfterThrowing("performance()")
	public void demandRefund() {
		System.out.println("demand a refund");
	}

}
1.3.2 建立環繞通知
@Aspect
public class Audience {
	
	//定義命名的切點
	@Pointcut("execution(** com.example.demo.springaop.Performance.perform(..))")
	public void performance() {}
	
	//環繞通知方法
	@Around("performance()")
	public void watchPerformance(ProceedingJoinPoint jp) {
	
		try {
			System.out.println("before");
			jp.proceed();
			System.out.println("after");
		} catch (Throwable e) {
			System.out.println("throw");
		}
		
	}
	}
1.3.3 處理通知中的引數
@Aspect
public class Audience {
	
	
	    //定義帶引數的切點
		@Pointcut("execution(** com.example.demo.springaop.Performance.perform(int))"+"&& args(number)")
		public void performance2() {}
		
		//前置通知
	@Before("performance2()")
	public void silenceCellPhones(int number) {
		System.out.println("silence cell phone");
	}
	}
	

相關推薦

Spring實戰學習3-面向切面的Spring

1、什麼是面向切面程式設計 在軟體開發中,散佈於應用中多處的功能被稱為橫切關注點,它們從概念上是與應用的業務邏輯相分離的。把這些橫切關注點與業務邏輯相分離正是面向切面程式設計(AOP)所要解決的問題。[日誌、事務、安全和快取] 切面能夠幫助我們模組化橫切關注點。

spring學習面向切面編程(AOP)概述

class service log 這就是 asp 余額 span string utf 註:本文大部分參考 --------------------- 本文來自 -望遠- 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/yanquan3

Spring Boot之AOP面向切面程式設計-實戰

目錄 前言 程式設計正規化主要有以下幾類 引入pom依賴 aop註解 實現日誌分割功能 前言 AOP是一種與語言無關的程式思想、程式設計正規化。專案業務邏輯中,將通用的模組以水平切割的方式進行分離統一處理,常用於日誌、許可權控制、異常處理等業務中。 程式設計正規化主

Spring框架——AOP(面向切面編程)詳解

通過 cts ssi 沒有 object 引入 集中 method 可能 1 AOP概述 ●AOP(Aspect-Oriented Programming,面向切面編程):是一種新的方法論,是對傳統 OOP(Object-Oriented Programming,面向對象

02 Spring的AOP(面向切面程式設計)

1、關於AOP AOP(Aspect Oriented Programming),即面向切面程式設計,可以說是OOP(Object Oriented Programming,面向物件程式設計)的補充和完善。OOP引入封裝、繼承、多型等概念來建立一種物件層次結構,用於模擬公共行為的一個集合。O

Spring 實戰學習筆記001

第一章  Spring之旅 1. Spring 是什麼?做什麼? 答: Spring 是一個開源框架, 致力於簡化Java開發。         簡化方式:讓簡單的JavaBean實現之前的複雜EJB做的事情。 2. Spring採取的4種關鍵設計策略: 答

Spring 實戰學習筆記(第三章 Bean的高階裝配)

一、開發環境、測試環境與生產環境載入不同資料的配置方式   [email protected]註解應用      @Profile註解配置方式,     1)配置在類上(只有prod或者dev profile啟用時,才會建立對應的bean)  package com.myapp; i

Spring框架之AOP面向切面程式設計

package com.jredu.aop.aspect; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; im

Spring實戰(7):面向切面的Spring

在軟體開發中,散佈於應用中多處的功能被稱為橫切關注點。通常來講,這些橫切關注點從概念上是與應用的業務邏輯相分離的。把這些橫切關注點與業務邏輯相分離正是面向切面程式設計所要解決的問題。 前面我們介紹瞭如何使用依賴注入管理和配置我們的應用物件。依賴注入有助於應用物

Spring AOP詳解面向切面程式設計

       Spring中的AOP代理還是離不開Spring的IOC容器,代理的生成,管理及其依賴關係都是由IOC容器負責,Spring預設使用JDK動態代理,在需要代理類而不是代理介面的時候,Spring會自動切換為使用CGLIB代理,不過現在的專案都是面向介面程式設計

SpringBoot實戰學習(十) Spring Boot型別安全配置

1.目錄結構 2.編寫 1.application.properties 新增配置 author.name=wen author.age=24 2.型別安全的Bean pack

Spring實戰學習1-裝配bean

1、spring裝配bean的機制 Spring容器負責建立應用程式中的bean並通過DI來協調這些物件的關係。 它提供了三種主要的裝配機制: (1)在XML中進行顯示配置 (2)在java中進行顯示配置[推薦] (3)隱式的bean發現機制和自動裝配[強烈推薦

Spring Boot2(六):使用Spring Boot整合AOP面向切面程式設計

一、前言 眾所周知,spring最核心的兩個功能是aop和ioc,即面向切面和控制反轉。本文會講一講SpringBoot如何使用AOP實現面向切面的過程原理。 二、何為aop ​ aop全稱Aspect Oriented Programming,面向切面,AOP主要實現的目的是針對業務處理過程中的切面進行提取

Spring boot 學習一: 認識Spring boot

XML 過程 maven 認識 很多 團隊 但是 日誌文件 pivotal 什麽是spring boot Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人

Spring框架學習(1)Spring簡介

校驗和 遵從 直接 特定 cto 適合 配置 有意 允許 內容源自:Spring 框架簡介 Spring 是一個開源框架,是為了解決企業應用程序開發復雜性而創建的。框架的主要優勢之一就是其分層架構,分層架構允許您選擇使用哪一個組件,同時為 J2EE 應用程序開發提供集成的框

Spring框架學習(4)spring整合hibernate

location host mage too 自動 exception 4.0 數據庫連接 find 內容源自:spring整合hibernate spring整合註解形式的hibernate 這裏和上一部分學習一樣用了模板模式, 將hibernate開發流程封裝在O

Spring框架學習(8)spring mvc上傳下載

class tor XML smart details targe resp imp common 內容源自:spring mvc上傳下載 如下示例: 頁面: web.xml: <?xml version="1.0" encoding="UTF-8"?>

Spring Boot學習總結】14.Spring Boot整合Redis-與傳統方式對比

前面我們講解了如何使用Spring Boot來控制事務,下面我們來講解一下如何使用Spring Boot來整合Redis 為了對比傳統工程與Spring Boot整合的不同,以及彰顯Spring Boot整合的優勢,我們會逐一剖析傳統整合方式與Spring Boot整合方式。 一、傳統方式整

Spring Boot學習筆記之使用Spring Boot建立一個簡單的web專案(工具使用IntelliJ IDEA)

新建Maven專案 1.File --> New Project --> Maven --> Next 2.填寫專案資訊,完成之後點選Next,然後點選Finish 3.專案建好之後如下圖所示 修改pom檔案中的配置資訊 <?xml version

Spring Boot學習筆記之使用Spring Boots實現資料庫操作(IntelliJ IDEA+navicat for Sql Server)

這裡使用Spring Boot實現了一個簡單的專案,能夠實現簡單的資料庫操作,工具使用的是IntelliJ IDEA2017.3,資料庫工具使用的是navicat for Sql Server,語言使用的Java。 1.新建一個空的Maven專案 2.匯入需要的jar包 pom.xml: