spring的aop整理
生活随笔
收集整理的這篇文章主要介紹了
spring的aop整理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
梳理一下概念,首先AOP它是什么東西,它是一個面向切面編程思想,反正一上升到思想,就意味著這哥們是跨語言,跨平臺,就是AOP它是一個非常大的東西,就像面向對象的思想是一樣的,所以咱們面向切面的思想,簡單來說一下,萬物皆對象,橫向重復代碼,縱向抽取,這是咱們面向切面的幾句話,面向切面有啥不理解的,咱們從咱們以往接觸過的三種情況,都能體驗面向切面,能,對不對,所以面向切面的范圍是很廣的,對不對,過濾器,攔截器,動態代理,都有面向切面的思想體現在里面,然后呢,接下來第二,說一下以前學過的動態代理,那動態代理和AOP之間是啥關系,通過動態代理可以體現,AOP思想,反過來,體現AOP思想未必要用動態代理,過濾是不是也體現AOP,攔截器也體現AOP,所以動態代理僅僅是AOP的一個體現形式,所以再往下繼續的話,那咱們動態代理又是什么,動態代理又是干啥的,動態代理你們不知道干嘛,所謂動態代理,對某一個目標對象和目標方法是不是進行增強,動態代理,咱們的目的,怎么寫清楚一點,就按條列,通過動態代理體現AOP思想,對目標對象中的方法進行增強,那么再往下,所以有一個概念叫做Spring AOP開發,這個概念又是啥意思,咱們今天學的AOP開發,Spring AOP開發是啥意思,Spring封裝了動態代理代碼,用Spring AOP開發的目的是什么呢,我們就不需要手寫動態代理代碼,我們不要封裝代碼,其實是不用寫的,當然介紹了一下Spring AOP的開發,他除了封裝動態代理代碼之外,還封裝了cglib代理,封裝了兩個代理方法,咱們這塊得出來的一個結論,那就意味著,可以對任何類進行代理增強,這兩個有啥區別,上面的動態代理,必須基于接口代理,下面是不需要接口,所以不管你有接口還是沒接口,是不是都可以進行代理,然后再往下
咱們學了一些名詞,學了一些名詞,Spring中的名詞,這Spring中的名詞,說白了就是你要玩AOP的話,把AOP那點事說清楚,AOP名詞就是我手頭有一個通知,通知里面寫著,比如說,要增強的代碼,然后另外一層,還有一個目標類,是不是有被代理的方法,void,比如save方法,這里面有業務邏輯,咱們是保存用戶,然后這個方法不只save,可能還有update,修改用戶,三個差不多了,還有一個delete,這個是刪除用戶,那咱們的目的,通知我們就寫一行,管理事務,那現在咱們的AOP,最終的目的就是把通知,是不是插入到希望管理事務的方法當中,增強的這個方法,是不是插入到這個方法中去,那需要將這個代碼插入到這里面去的話,這個方法在這個類當中,是不是叫目標類,那咱們說可以插入的方法,咱們是不是叫做什么,可以被插入,或者可以被應用通知的方法,就是連接點,然后呢,需要或者真正已經織入通知的的方法就是切入點,然后把通知真正織入到方法當中,這個過程叫做織入,把這兩個結合叫做織入,這兩個進行織入之后,是不是會生出一個子來,就是你吧通知織入到目標對象當中,產生一個什么對象,是不是代理對象,明白啥意思了,會生成一個代理對象,這個方法你可以想象的到,是不是相當于,就那這個保存為例,是不是這個管理事務,是不是進來了,在代理方法當中,就是這四個方法,是不是把通知應用進來了,這是不是就是代理對象,生成代理對象的過程,叫做織入,面向編程從頭到尾不就這點知識嗎,首先面向切面編程思想,思想是最大的,然后動態代理為了體現AOP思想
然后動態代理的目的,目的是干啥,是為了將目標方法增強,那Spring AOP干嘛,是怎么來寫動態代理和cglib這些代碼,他是不是把這些代碼封裝了,你只要配一配他就幫你寫這些代碼,那之后Spring AOP這些名詞,是把通知織入到目標對象的過程,然后這些名詞你要會叫,然后怎么來配,怎么來進行配置呢,那這個配置的話,要玩的話首先要導包,這是4+2的基礎上再+2,然后準備目標對象,然后準備通知,咱們說Spring當中,他這個很體貼,準備了一種通知,準備了N多種通知,5種,使用咱們需要的各種情況,然后最后通過這種配置表達出來,咱們要講通知織入到目標對象,咱們把目標對象和通知對象截圖
<!-- 1.配置目標對象 --><bean name="userService" class="com.learn.service.UserServiceImpl"></bean><!-- 2.配置通知對象 --><bean name="myAdvice" class="com.learn.d_springaop.MyAdvice"></bean>
是不是這個意思,這個配置能看懂,這個知識點就結了,這個配置首先前兩個是絕對能看懂的,這個目標對象就是UserServiceImpl,就拿圖上來,然后配置這個通知,這東西,然后目的是想跟Spring描述一下,我想通知織入到目標對象中,咱們跟Spring交流,不能跟他說話,我打算把咱們的通知,是不是織入到這個切入點當中,這個切入點是不是寫的很清晰,哪個是我的目標對象呢,是在我這個包下,目標是ServieImpl的類,然后這個方法名的話,參數任意,返回值任意,說白了就是所有的方法,然后告訴他切點之后,那你就要說,myAdvice那這里是不是通知,那其中before方法,這是不是咱們的前置通知,然后前綴通知這個代碼,這個是前置通知的內容,打算插入到哪去啊,這里是不是把插入點pc傳入到這里了,是不是打算這個類,所有方法里面去,然后下面都是一樣了,這表示一個后置通知,打算把這個增強到哪去呢,又是這個切點,然后依次類推,環繞通知,是不是也到這里面去,后置也增強進去,然后接下來的話,咱們只要配了這個以后,咱們再獲得這個userService的時候,直接獲得的就是什么對象,是不是代理對象,你只要配了這一段以后,只要你這個userService符合這個切點表達式,他就會對你這個userService產生代理,并且你直接獲得userService是不是就是代理,就不用問怎么獲得代理對象,只能獲得代理了,只能獲得代理之后的對象了,所以由此咱們的測試
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd "><!-- 準備工作:導入(約束)aop的命名空間 --><!-- 1.配置目標對象 --><bean name="userService" class="com.learn.service.UserServiceImpl"></bean><!-- 2.配置通知對象 --><bean name="myAdvice" class="com.learn.d_springaop.MyAdvice"></bean><!-- 3.配置將通知織入目標對象 --><aop:config><!-- 配置切入點 public void com.learn.service.UserServiceImpl.save()void com.learn.service.UserServiceImpl.save()* com.learn.service.UserServiceImpl.save()* com.learn.service.UserServiceImpl.*()* com.learn.service.UserServiceImpl.*(..)* com.learn.service.*ServiceImpl.*(..)* com.learn.service..*ServiceImpl.*(..)--><aop:pointcut expression="execution(* com.learn.service.*ServiceImpl.*(..))" id="pc"/><aop:aspect ref="myAdvice"><!-- 指定名為before方法作為前置通知 --><aop:before method="before" pointcut-ref="pc" /><!-- 后置 --><aop:after-returning method="afterReturning" pointcut-ref="pc"/><!-- 環繞通知 --><aop:around method="around" pointcut-ref="pc"/><!-- 異常攔截通知 --><aop:after-throwing method="afterException" pointcut-ref="pc"/><!-- 后置 --><aop:after method="after" pointcut-ref="pc"/></aop:aspect></aop:config></beans>
前面咱們說過就是創建容器的,在這里就是把咱們的UserService通過名稱取出來,就是這個方法,是不是service方法一執行,是不是就執行代理了,看明白啥意思了
package com.learn.d_springaop;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;import com.learn.service.UserService;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:com/learn/d_springaop/applicationContext.xml")
public class Demo {/*** 將名為userServiceTarget的對象注入到us變量中*/@Resource(name="userService")private UserService us;@Testpublic void fun1() {us.save(); }
}
你要說,就是這點事,把一個代碼織入到一個目標對象當中,那你學的話就學通知,學目標對象就不用說,不用學都會,體現通知已經咱們的目標對象,以及配置產生代理,是不是就是這點事
?
總結
以上是生活随笔為你收集整理的spring的aop整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring的aop配置-配置将通知织入
- 下一篇: spring的aop注解配置(了解)