1. 程式人生 > >Spring-AOP 自動建立代理

Spring-AOP 自動建立代理

導讀

概述

我們通過前面幾篇博文的案例,我們會發現都是通過ProxyFactoryBean建立織入切面的代理,每個需要被代理的Bean都需要使用一個ProxyFactoryBean進行配置。

幸好Spring提供了自動代理機制,讓容器自動生成代理,把開發人員從繁瑣的配置中解脫出來。在內部,Spring使用BeanPostProcessor自動完成這項工作

實現類介紹

基於BeanPostProcessor的自動代理建立器的實現類,將根據一些規則自動在容器例項化Bean時為匹配的Bean生成代理內容。

這些代理建立器可以分為3類

  • 基於Bean配置名規則的自動代理建立器
    允許為一組特定配置名的Bean自動建立代理例項的代理建立器,實現類為BeanNameAutoProxyCreator

  • 基於Advisor匹配機制的自動代理建立器
    它會對容器中所有的Advisor進行掃描,自動將這些切面應用到匹配的Bean中(為目標Bean建立代理例項),實現類為DefaultAdvisorAutoProxyCreator

  • 基於Bean中的AspectJ註解標籤的自動代理建立器
    為包含AspectJ註解的Bean自動建立代理例項,實現類為AnnotationAwareAspectJAutoProxyCreator.

自動建立代理器實現類的繼承圖

這裡寫圖片描述

可以清楚的看到所有的自動代理器類都實現了BeanPostPorcessor,在容器例項化Bean時,BeanPostProcessor將對它進行加工處理,所以自動代理建立器有機會對滿足匹配規則的bean自動建立代理物件

BeanNameAutoProxyCreator

DefaultAdvisorAutoProxyCreator

AnnotationAwareAspectJAutoProxyCreator

AOP總結

AOP是OOP的延伸,它為程式開發提供了一個嶄新的思考角度,將可以重複性的橫切邏輯抽取到統一的模組中,通過OOP的縱向抽象和AOP的橫向抽取,程式才可以真正解決重複性程式碼問題。

Spring採用JDK動態代理和CGLib動態代理技術在執行期織入增強,所以不需要裝備特殊的編譯器或類裝載器就可以使用AOP功能。

要使用JDK動態代理,目標類必須實現介面,而CGLib不對目標類作任何限制,它通過動態生成目標類子類的方式提供代理。

在JDK動態代理中通過介面來實現方法攔截,所以必須確保要攔截的目標在介面中有定義,否則將無法攔截

在CGLib動態代理中通過動態生成代理子類來實現方法攔截,所以必須確保要攔截的目標方法可以被子類訪問,也就是目標方法必須定義為非final,且非私有例項方法。

JDK在建立代理物件時的效能高於CGLib,而生成的代理物件的執行效能卻比CGLib低。 如果是singleton的代理,推薦使用CGlib動態代理。

Spring只能在方法級別上織入增強,Spring提供了4種類型的方法增強,分別是前置增強、後置增強、環繞增強、異常丟擲增強,此外還有一種特殊的引介增強。 引介增強是類級別的,它為目標類織入新的介面實現。 從廣義上將,增強其實是一種最簡單的切面,它既包括橫切程式碼又包括切點資訊,只不過它的切點只是簡單的方法相對位置資訊。 所以增強一般需要和切點聯合才可以表示一個更具實用性的切面。

在Spring中,普通的切點通過目標類名和方法名描述連線點的資訊。 流程切點是比較特殊的切點,它通過方法呼叫堆疊的執行環境來決定連線點。 有時候需要通過切點的交叉或者合併描述一個最終的切點,可以使用ComposablePointcut的複合切點

切面是增強和切點的聯合體,可以很方便的通過Spring提供的ProxyFactoryBean將切面自入不同的目標類中。 當然為每個目標類手工配置一個切面是比較繁瑣的,Spring利用BeanPostProcessor可干涉Bean生命週期的機制,提供一些可以自動建立代理、自入切面的自動代理建立器,其中DefaultAdvisorAutoProxyCreator是功能強大的自動代理穿件器,它可以將容器中所有的Advisor自動織入目標Bean中。

相關推薦

Spring-AOP 自動建立代理

導讀 概述 我們通過前面幾篇博文的案例,我們會發現都是通過ProxyFactoryBean建立織入切面的代理,每個需要被代理的Bean都需要使用一個ProxyFactoryBean進行配置。 幸好Spring提供了自動代

Spring-AOP 自動建立代理之AnnotationAwareAspectJAutoProxyCreator

導讀 例項 導讀 例項 介面 package com.xgj.aop.spring.advisor.aspectJ.aspectJByConf

spring aop 自動建立代理BeanNameAutoProxyCreator詳解

程式碼示例 <?xml version=”1.0” encoding=”UTF-8”?> <beans xmlns=”http://www.springframework.org/schema/beans” xmln

Spring Aop自動建立代理

1.介紹 在Bean生命週期過長中呼叫BeanPostProcessor,將物件進行包裝,生成代理物件。 2.舉例 public class LogMethodInterceptor implements MethodInterceptor

Spring AOP系列之代理建立

Spring Boot AOP系列之動態代理建立 序言:在本文中,我會講到Spring中如何建立動態代理,如何利用jdk或者cglib來建立動態代理,但是同時,我也會提及如何手動建立代理,這將有助於我們瞭解動態代理的原理。我們先來講講如何手動建立吧

spring aop自動代理註解配置失效問題及原理機制整理總結

迭代中遇到的問題處理 問題:用自動代理註解配置攔截了PlanService類的方法testAopFace,方法testAopFace被PlanService類的方法query呼叫。http請求controller後呼叫了方法query,aop對方法testAopFace

Spring AOP 自動代理執行增強

基本類 package com.advice; /** * @author Duoduo * @version 1.0 * @date 2017/4/25 23:41 */ pu

深入理解Spring AOP之二代理對象生成

gets code 網上 none work class als post 產生 深入理解Spring AOP之二代理對象生成 spring代理對象 上一篇博客中講到了Spring的一些基本概念和初步講了實現方

Spring AOP之 動態代理實例

delete 日誌 實現類 imp exc print cati user ins 1.項目結構圖如下3.3.3.1: 圖3.3.3.1 2.IUserServ接口代碼與UserServImpl實現類代碼和上述代碼相同 3.LogHandler類代碼

Spring AOP之動態代理

Spring AOP有兩種動態代理的方式,一種是jdk的動態代理,一種是cglib實現的動態代理,看下兩種代理的實現方式。 1.jdk的動態代理 介面: public interface ISaler { public void buy(); } 實現類: public

spring AOP概念及代理模式

spring AOP 代理模式的英文Proxy或Surrogate,中文都可譯為”代理“,代理的含義,就是邀請一個人或者一個機構代表另一個人或者另一個機構採取行動。 在一些情況下,一個客戶不想或者不能夠直接引用一個物件,而代理物件可以在客戶端和目標物件之間起到中介的作用。 JAVA中的動態代理和靜態代理

Spring AOP --JDK動態代理方式

我們知道Spring是通過JDK或者CGLib實現動態代理的,今天我們討論一下JDK實現動態代理的原理。 一、簡述 Spring在解析Bean的定義之後會將Bean的定義生成一個BeanDefinition物件並且由BeanDefinitionHolder物件持有。在

解決spring aop無法攔截代理內部函式呼叫的問題

code如下: public class ServiceAImpl implements ServiceA{ public void function01(...){ ... this.function02(...)

spring aop實現類似代理類和類中的方法(註解實現)

1.可以指定aop的執行次序 [email protected],可以攔截類上有@DataSource註解的類中的所有方法 [email protected]可以攔截有註解@DataSource的方法 4.兩者結合可以實現類似Spring註解

spring aop切面動態代理xml配置實現

上次我已經寫過aop用註解實現的這次是用配置實現,個人感覺配置實現比較好,畢竟程式是給人看的嗎,配置裡寫的一清二楚,別人看來也好懂,而且配置修改起來也比較容易,便於後期維護及修改,而才用註解方式的修改,需要修改註解,或者重寫實現類,比較麻煩,建議採用配置方式實現,至於效能方

SpringAOP兩種代理機制對比(JDK和CGLib動態代理

Sprign 動態代理機制 Spirng的AOP的動態代理實現機制有兩種,分別是: 1)JDK動態代理: 具體實現原理: 1、通過實現InvocationHandlet介面建立自己的呼叫處理器 2、

Spring AOP原始碼分析--代理方式的選擇

能堅持別人不能堅持的,才能擁有別人未曾擁有的。關注程式設計大道公眾號,讓我們一同堅持心中所想,一起成長!!   年前寫了一個面試突擊系列的文章,目前只有redis相關的。在這個系列裡,我整理了一些面試題與大家分享,幫助年後和我一樣想要在金三銀四準備跳槽的同學。我們一起鞏固、突擊面試官常問的一些面

Spring AOP的實現:建立AopProxy代理物件

        前面我們講述了AOP的基本知識以及在Spring AOP機制中的一些基本的資料結構及其功能。下面開始正式的講述Spring AOP的實現部分。 來看一下這個以ProxyFactory為中心的繼承關係圖 可以將P

Spring原始碼解析(十五)——AOP原理——建立aop代理

   * AnnotationAwareAspectJAutoProxyCreator【InstantiationAwareBeanPostProcessor】    的作用:  * 1)、每一個bean建立之前,呼叫postProce

javaEE Mybatis,Mybatis與Spring整合之動態代理方式(推薦),自動建立Dao層實現類

src/applicationContext.xml(Spring核心配置檔案): <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.or