1. 程式人生 > >Spring AOP系列之代理建立

Spring AOP系列之代理建立

Spring Boot AOP系列之動態代理建立

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

一、 手動建立之jdk動態代理

1、 jdk動態代理是基於介面的,所以必須要寫一個介面,以及實現類,然後還需要寫一個類來實現InvocationHandler類,

介面如下

public interface Helloworld {
    void sayHello();
}

實現類如下:

public
class HelloworldImpl implements HelloWorld { public void sayHello() { System.out.print("hello world"); } }

攔截類如下:

public class MyInvocationHandler implements InvocationHandler{
    private Object target;
    public MyInvocationHandler(Object target) {
        this.target=target;
    }
    public
Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("method :"+ method.getName()+" is invoked!"); return method.invoke(target,args); } }

測試如下:

public class JDKProxyTest {
    public static void main(String[]args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
       //重要的是這裡的newProxyInstance方法,後面博文講原理的時候會講到為什麼會植入切面的
HelloWorld helloWorld=(HelloWorld)Proxy. newProxyInstance(JDKProxyTest.class.getClassLoader(), new Class<?>[]{HelloWorld.class}, new MyInvocationHandler(new HelloworldImpl())); helloWorld.sayHello(); } }
2、這裡先教大家怎麼做,以後教大家原理,現在依葫蘆畫瓢就行

二、手動建立之CGLIB代理

1、cglib代理和jdk代理目的差不多,但是cglib代理不僅可以代理介面,還可以代理類,比jdk代理作用 範圍更加廣泛一些,cglib代理藉助了ASM這個非常強大的Java位元組碼生成框架
2、demo如下

介面:

public interface Subject {    
   public void request();  
}

實現:

public class RealSubject implements Subject{    
   public void request(){    
       System.out.println("From real subject.");    
   }    
}

處理類,也叫回調方法:

//實現了InvocationHandler,很重要
public class DynamicSubjectHandler implements InvocationHandler    
{    
    private Object obj;//這是動態代理的好處,被封裝的物件是Object型別,接受任意型別的物件    

    public DynamicSubject()    
    {    
    }    

    public DynamicSubject(Object obj)    
    {    
        this.obj = obj;    
    }    

    //這個方法不是我們顯示的去呼叫    
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable    
    {    
        System.out.println("before calling " + method);    

        method.invoke(obj, args);    

        System.out.println("after calling " + method);    

        return null;    
    }    

}    

Test方法:

public class Client{
    public static void main(String[] args){
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(RealSubject.class);//繼承被代理的那個類
        enhancer.setCallback(new DynamicSubjectHandler())//設定回撥類
        RealSubject realSubject = (RealSubject)enhancer.create();//建立代理物件
        realSubject.request();
    }
}
//PS: 這段程式碼是我手敲的,大家貼上的時候注意一下哈
2、執行main方法之後,DynamicSubjectHandler 中的invoke方法會被顯式呼叫,打印出資訊,原理後面我會介紹,詳情關注下篇博文。

三、Spring boot建立之JDK動態代理

事實上,spring對於代理的類的建立選用何種方法是有規律可尋的,詳細可看一下原始碼,如下:

spring如何選擇代理型別

spring在建立代理的時候,會呼叫DefaultAopProxyFactory裡面的createAopProxy方法,這個方法會取判斷是使用jdk動態代理還是cglib代理。第一個引數,config.isOptimize(),這個方法是一個配置的,用於判斷建立代理是否樂觀(是否會經常改動),預設配置為false,第二個引數是不是目標代理類。第三個引數,hasNoUserSuppliedProxyInterfaces()這個方法,判斷代理類的AdviseSupport處理類是不是隻會指定SpringProxy這個介面,一般會返回true。當這些條件都不滿足的時候,spring 預設走jdk動態代理。當滿足這些條件中某一個的時候,去判斷是不是介面或者已經是代理類,如果是介面或者已經是代理類的時候,就去走jdk動態代理,否者走cglib代理

OK,講清楚了spring選擇動態代理的原因之後,我們來看看怎麼指定jdk動態代理。

Spring boot配置jdk動態代理很簡單,只需要在Spring boot配置檔案中配置

spring.aop.proxy-target-class=false

然後自己寫代理類的時候注意是介面就完畢啦。

四、Spring boot建立之Cglib代理

同理,spring boot建立Cglib代理也很簡單,直接配置

spring.aop.proxy-target-class=true

就可以強制使用cglib代理

下篇博文介紹原理哈

相關推薦

Spring AOP系列代理建立

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

Spring AOP實驗靜態代理

註入 ans 執行 軟件開發 動態代理 sin modified 實現 編譯 1 AOP的概念和原理 1.1 AOP原理   AOP(Aspect Oriented Programming),也就是面向方面編程的技術。AOP基於IoC基礎,是對OOP的有益補充。   

Spring入門系列代理模式和AOP

代理模式概述 代理是一種設計模式,提供了對目標物件另外的訪問方式,通過代理物件訪問目標物件。這樣可以在目標物件功能實現的基礎上,增加額外的功能,從而達到擴充套件目標物件功能的效果。簡言之,代理模式就是設定一箇中間代理來控制訪問原目標物件,以達到增強原物件的功能和簡化訪問方式。 靜態代理 這種代理方式需要

spring AOP解析註解方式詳解

parser 分享 pro asp mes aop log space spec 命名空間處理器是AopNamespaceHandler,我們可以看到這裏註冊了幾個解析器,第一個我們知道是xml形式的解析,接下來我們看AspectJAutoProxyBeanDefiniti

使用Redisson實現分布式鎖,Spring AOP簡化

獲取鎖 rip dss 執行c lease dset wire template alt 源碼 Redisson概述 Redisson是一個在Redis的基礎上實現的Java駐內存數據網格(In-Memory Data Grid)。它不僅提供了一系列的分布式的Java常用對

Spring 框架系列 JDBC 整合實例

nat ttr span ring 分享圖片 AC 增刪 not 增刪改 微信公眾號:compassblog 歡迎關註、轉發,互相學習,共同進步! 有任何問題,請後臺留言聯系! 1、Spring框架整合 DAO 模板 JDBC:org.springframework.

Spring 框架系列事務管理

操作 提交 目標 form 重復 表達 required supports 嵌套事務 1、事務回顧 (1)、什麽是事務: 事務是邏輯上的一組操作,組成這組操作的各個邏輯單元,要麽一起成功,要麽一起失敗。 (2)、事務特性(ACID) 原子性 :強調事務的不可分割 一致性

spring boot 系列三:spring boot 整合JdbcTemplate

closed com context boot pin pan url wired ace 前面兩篇文章我們講了兩件事情: 通過一個簡單實例進行spring boot 入門 修改spring boot 默認的服務端口號和默認context path 這篇文章我們來看下怎

spring boot 系列四:spring boot 整合JPA

rom prop pos output UNC actor href ali div 上一篇我們講了spring boot 整合JdbcTemplate來進行數據的持久化, 這篇我們來說下怎麽通過spring boot 整合JPA來實現數據的持久化。 一、代碼實現  修改

Spring Boot2.0 原理—建立內建Tomcat容器

前面所述的https://www.cnblogs.com/toov5/p/9823728.html 中的第一條先不贅述了,就是玩了maven 重點介紹後兩條 首先內建Tomcat:   SpringBoot中內建tomcat伺服器   Java操作建立tomcat &n

我不想成為鹹魚系列字串建立方式及記憶體的簡單分析

前言:今天不學習,明天變鹹魚 我們都知道建立字串的方式有兩種(基本的建立方式,clone序列化...不考慮) a.String s1 = "asdf"; b.String s2 = new String("asdf"); 我們首先分析下他在記憶體中的分配情況: 對於s1來說他

初步學習Spring Aop使用配置方式

前言:   初步學習接觸Spring框架使用,而在這裡對自己剛學的Aop使用做個小篇幅的總結,方便日後需要用到是可以快速入手!   僅用於對自己學習個人筆記,不做任意分享,純屬個人理解不想誤認子弟!   一、Aop知識點理解   AOP稱為面向切面程式設計,在程式開發中主要用來解決一些系統

Spring Boot 系列五:Spring Boot 通過devtools進行熱部署

前面已經分享過四篇學習文章: 1、Spring Boot 系統之一:Spring Boot 入門 2、Spring Boot 系統之二:Spring Boot 修改預設埠號和context path 3、Spring Boot 系統之三:Spring Boot 整合JdbcTemplat

初步學習Spring Aop使用註解方式

前言: 這裡就主要演示Spring中Aop使用註解是怎麼使用,如果需要了解更多Aop相關概念,可檢視相關資料的介紹 一、專案目錄  【標記檔案為主要檔案】 二、各個檔案的程式碼 AopServer.java  【編寫切點的檔案,就是一些需要被修飾的業務處理】 package aop; i

Spring Security系列入門應用(二)

文章來源 上一篇文章 Spring Security系列之體系結構概述(一),我們介紹了Spring Security的基礎架構,這一節我們通過Spring官方給出的一個guides例子,來了解Spring Security是如何保護我們的應用的,之後會對進行一個解讀。 引入依賴 &l

Spring Security系列體系結構概述(一)

文章來源 這篇文章是我Spring Security系列的第一篇,主要是根據Spring Security文件選擇性翻譯整理而成的一個架構概覽,配合自己的一些註釋方便大家理解。寫作本系列文章時,參考版本為Spring Security 4.2.3.RELEASE。 核心元件 這一節主要

Java系列代理模式

一,寫在前面     在學習設計模式前,建議對設計模式的六大原則有所瞭解。六大原則是指導方針,設計模式則是適用於不同場景的指導方針的具體實現。在文章觀察者模式中對六大原則有簡單的介紹,這裡不再重複闡述。     為了更好去理解代理模式的思想,下面會講到一個現實生活中的小栗

Spring Security系列核心過濾器原始碼分析(四)

文章來源 前面的部分,我們關注了Spring Security是如何完成認證工作的,但是另外一部分核心的內容:過濾器,一直沒有提到,我們已經知道Spring Security使用了springSecurityFillterChian作為了安全過濾的入口,這一節主要分析一下這個過濾器鏈都包含了哪

2.偏頭痛楊的spring教學系列依賴注入篇

前戲 控制反轉與依賴注入是spring中最最最重要的概念,沒有之一, 常常拿出來一起說,那麼什麼是控制?又怎樣去反轉? 什麼是依賴?又怎樣去注入? 今天讓我們來揭開依賴注入&控制反轉的神祕面紗。 本文的程式碼全部使用xml的方式,註解方式後面會單獨有一章

spring AOP概念及代理模式

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