1. 程式人生 > >Spring的AOP自動代理(含AspectJ的AOP開發)

Spring的AOP自動代理(含AspectJ的AOP開發)

1.自動代理:

 上面這兩種代理的方式不好,需要為每一個類配置一個獨立的ProxyFactoryBean.(如果需要代理的類特別的多,每個類都需要建立一個代理的類.)

根據切面Advisor的定義的資訊,看到哪些類的哪些方法需要增強.(為這些需要增強的類生成代理.

自動代理:基於後處理BeanPostProcessor完成代理.

代理機制不同

     基於ProxyFactoryBean代理:先有被代理物件,將被代理物件傳遞給代理物件,為其生成代理.

自動代理:基於BeanPostProcessor代理.在生成類的過程中產生一個代理物件,返回的就是代理物件本身.

BeanNameAutoProxyCreator
根據Bean名稱建立代理
DefaultAdvisorAutoProxyCreator根據Advisor本身包含資訊建立代理AnnotationAwareAspectJAutoProxyCreator基於Bean中的AspectJ註解進行自動代理       == >BeanNameAutoProxyCreator: <!--後處理Bean配置:不需要配置id --><!--自動代理--><bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!--配置Bean的名稱--><property name="beanNames" value="*Dao"/><property name="interceptorNames" value="beforeAdvice"/></bean> == >DefaultAdvisorAutoProxyCreator :
<!--定義切面(帶有切點切面)--><bean id="myAdvisor"class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"
>
<property name="pattern" value="cn\.itcast\.spring3\.demo4\.CustomerDao\.add.*"/><property name="advice" ref="aroundAdvice"/></bean><bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean>

區分:

代理機制不同:

基於ProxyFactoryBean代理:先有被代理物件,將被代理物件傳遞給代理物件,為其生成代理.自動代理:基於BeanPostProcessor代理.在生成類的過程中產生一個代理物件,返回的就是代理物件本身.

:

2.1什麼是AspectJ

AspectJ概述

Spring為了簡化AOP的開發,引入AspectJ技術.

 AspectJ一個面向切面的框架,它擴充套件了Java語言。AspectJ定義了AOP語法所以它有一個專門的編譯器用來生成遵守Java位元組編碼規範的Class檔案。

 Spring2.0以後新增了對AspectJ切點表示式支援

AspectJ的通知型別;

@Before前置通知,相當於BeforeAdvice@AfterReturning後置通知,相當於AfterReturningAdvice@Around環繞通知,相當於MethodInterceptor@AfterThrowing丟擲通知,相當於ThrowAdvice@After最終final通知,不管是否異常,該通知都會執行@DeclareParents引介通知,相當於IntroductionInterceptor(不要求掌握)

AspectJ的切點的表示式定義:

配置哪些類的哪些方法需要使用增強:

類似於正則的方法切點切面.

語法:

execution(<訪問修飾符>?<返回型別><方法名>(<引數>)<異常>) 例如: execution(* *(..)); execution(* cn.itcast.spring3.demo1.UserDao.*(..)) execution(* cn.itcast.spring3.demo1.*(..)) execution(* cn.itcast.spring3.demo1..*(..)) execution(* cn.itcast.dao.UserDAO+.*(..))

2.2基於註解AspectJ

步驟一:引入AspectJ的相應jar:

aspectJ的開發需要依賴aop的環境.

引入aspectJ的jar包:com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar引入spring整合aspectJ的jar包:spring-aspects-3.2.0.RELEASE.jar

步驟二:引入配置檔案:

Log4jspring的配置檔案

步驟三:建立包和類:

cn.green.demo5UserDaoUserDaoImpl

步驟四:定義切面:

切面:就是切點和通知組合.

在哪些類的哪些方法上使用增強.

定義切面:

@Aspect

定義增強:

@Before前置通知,相當於BeforeAdvice@AfterReturning後置通知,相當於AfterReturningAdvice@Around環繞通知,相當於MethodInterceptor@AfterThrowing丟擲通知,相當於ThrowAdvice@After最終final通知,不管是否異常,該通知都會執行@DeclareParents引介通知,相當於IntroductionInterceptor(不要求掌握)

程式碼:

package cn.green.demo5;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;@AspectpublicclassMyAspectAnno{@Before(value="execution(* cn.green.demo5.UserDao.add(..))")publicvoid before(){System.out.println("這是before增強.....");}}

步驟五:配置:

引入aop的約束

<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">    <!-- 基於AspectJ的自動代理.使用AnnotationAwareAspectJAutoProxyCreator  --><aop:aspectj-autoproxy/><beanid="userDao"class="cn.green.demo5.UserDaoImpl"></bean><beanid="myAspectionAnno"class="cn.green.demo5.MyAspectAnno"></bean></beans>
測試樣例:
package cn.green.demo5;import javax.annotation.Resource;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext3.xml")publicclassTestCase{@Resource(name="userDao")privateUserDao userDao;@Testpublicvoid demo(){ userDao.delete(); userDao.update(); userDao.add(); userDao.find();}}
結果:
delete run....update run....這是before增強.....add run....find run....

2.2.1 AspectJ的通知的型別:

@Before:前置通知:在目標方法之前執行.(不能攔截目標方法.)*JoinPoint:連線點@AfterReturing:後置通知:在目標方法執行之後執行.*JoinPoint:連線點*Object:返回值// 後置增強:@AfterReturning(value="execution(* cn.itcast.spring3.demo1.UserDao.delete(..))",returning="result")publicvoid afterReturing(JoinPoint joinPoint,Object result){System.out.println("後置增強=============="+result);}@Around:環繞通知:// 環繞通知:(阻止目標物件的方法執行)@Around(

相關推薦

Spring的AOP自動代理AspectJ的AOP開發

1.自動代理:  上面這兩種代理的方式不好,需要為每一個類配置一個獨立的ProxyFactoryBean.(如果需要代理的類特別的多,每個類都需要建立一個代理的類.) 根據切面Advisor的定

Springboot使用Jsp模板檢視開發web應用問題分析

最近有個springcloud專案,所有服務返回的資訊是json字串,現在需要對專案進行改造,使用jsp頁面返回服務呼叫結果。開發工具為Idea。 先來看一下專案結構(只展示涉及到的部分,如果你的專案中沒有對應資料夾,需要新建資料夾): ├── src │ ├── main │

USB開裝置開發學習之二: USB具體通訊過程列舉過程

原文:https://blog.csdn.net/go_str/article/details/80802452  前言     現在剛開始接觸USB的開發,零零散散學習了一些USB基礎知識,但是卻得不到連貫。在這個學習過程中首先困惑的就是USB

《微信公眾平臺開發教程java程式碼》下載

2018年11月02日 14:23:40 茹粿鰅莧丨你 閱讀數:7 標籤: 程式設計 資料 區

想著手學習微信小程式開發的看過來本地開發方式

瀏覽部落格,五一發現一片很好的文章,原網址(http://blog.csdn.net/anda0109/article/details/53366804),寫的很不錯,故轉載分享給更多的人。       就像學習一門開發語言首先會寫出“Hello World”一樣,學習

WebKit開發實戰:在WPF中使用WebKit控制元件示例程式碼

WebKit 是一個開源的瀏覽器引擎,可以用於程式內建瀏覽器的開發。開發時,需要將WebKit的相關檔案都拷貝至專案檔案,方便程式設計時呼叫,實現WebKit的功能。 在WPF中使用WebKit時,需要新增以下引用。 新增好引用後,就可以在WPF中使用WebKit控

開發訊息推送服務,基於Netty protobuf--fpushgithub原始碼

開發訊息推送服務,基於Netty protobuf--fpush-含github原始碼 技術棧 程式碼簡介 系統架構 1.系統部署架構圖如下: 2. 移動客戶端鑑定許可權原理 3. server端推送

從零開始開發IoC依賴注入框架 -- containerx 深入研究Spring原始碼github原始碼

摘要: 自己寫了一個開源的IoC控制反轉(依賴注入)框架,名為containerx。初學Spring原始碼的同學,可以先研究下這個小專案。更容易理解Spring的原始碼 自己寫了一個開源的IoC控制反轉(依賴注入)框架,名為containerx。初學Spring原始碼的同學,可以先研究下這個

開發環境-Windows下搭建JAVA Web開發環境Tomcat+MySQL-過程記錄

一、新建雲伺服器 (請注意,文中連結均在“http”中“h”後和“www”第一個“w”後多加一“ ”)     1、在"teng xun 雲",新建雲伺服器:Windows Server 2012 R2 標準版 64位中文版     2、登入雲伺服器:h ttps://w

JavaWeb ajax非同步自動填充圖解執行流程

資料庫表 先看結果 按aa顯示的結果: 按aaa顯示的結果: 檔案目錄 關鍵知識點 1.jQuery中的ajax $.post(url,[params],fn,

自主開發linux下的WeChat圖形介面

主要技術: 主要用到的技術有,udp socket, C++ stl容器,生產者消費者模型, shell指令碼程式設計,json 序列化和反序列化,ncurses 終端介面設計等 結果展示:

轉: 【Java並發編程】之五:volatile變量修飾符—意料之外的問題代碼

功能 模式 aik 執行 方法 end bold 有變 目的 轉載請註明出處: volatile用處說明 在JDK1.2之前,Java的內存模型實現總是從主存(即共享內存)讀取變量,是不需要進行特別的註意的。而隨著JVM的成熟和優化,現在在多線程環境下vo

【Java並發編程】之六:Runnable和Thread實現多線程的區別代碼

技術分享 runnable 避免 實際應用 details div 一個 預測 enter 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/17161237 Java中實現多線程有兩種方法:繼承Thre

轉: 【Java並發編程】之二十:並發新特性—Lock鎖和條件變量代碼

ets exc n) 否則 max 長時間 info trace space 簡單使用Lock鎖 Java 5中引入了新的鎖機制——Java.util.concurrent.locks中的顯式的互斥鎖:Lock接口,它提供了比synchronized更加廣泛的鎖

轉: 【Java並發編程】之十八:第五篇中volatile意外問題的正確分析解答代碼

深入 規則 rup lis con method 執行 change .text 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/17382679 在《Java並發編程學習筆記之五:volatile變量修

轉:【Java並發編程】之十六:深入Java內存模型——happen-before規則及其對DCL的分析代碼

無需 bit 對象引用 說了 final 緩存 機器 通過 round 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/17348313 happen—before規則介紹 Java語言中有一個“先行發生

轉:【Java並發編程】之十二:線程間通信中notifyAll造成的早期通知問題代碼

data light lan 添加項 article util tool 元素 seconds 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/17229601 如果線程在等待時接到通知,但線程等待的條件

轉:【Java並發編程】之十九:並發新特性—Executor框架與線程池代碼

接口類 容易 20px 了解 大小 執行c 生命周期 schedule p s Executor框架簡介 在Java 5之後,並發編程引入了一堆新的啟動、調度和管理線程的API。Executor框架便是Java 5中引入的,其內部使用了線程池機制,它在java.

轉:【Java並發編程】之十一:線程間通信中notify通知的遺漏代碼

key wait title net fill article 返回 0ms 註意 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/17228213 notify通知的遺漏很容易理解,即threadA還沒

轉:【Java並發編程】之八:多線程環境中安全使用集合API代碼

控制 and clas ron com lan 創建 pri 基本上 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/17200509 在集合API中,最初設計的Vector和Hashtable是多線程安