spring心得9--自動代理知識點講解及案例分析
1.自動代理知識點介紹
自動代理的產生原因:
有許多類需要通知時,顯式的建立每個代理就會顯得很笨拙。spring有一個自動代理機制,它可以讓容器為我們產生代理。自動代理類分兩種,分別是以下兩種:
BeanNameAutoProxyCreator、DefaultAdvisorAutoProxyCreator
BeanNameAutoProxyCreator
該類為匹配一系列名字的Bean自動建立代理。這種名字匹配和前面講到的NameMethodMatherPointcut類似,他也允許在名字的兩端進行萬用字元。通常為符合相同命名規則的bean應用一個或一組切面。
DefaultAdvisorAutoProxyCreator
該類實現了BeanPostProcessor介面。當應用上下文讀入所有的Bean的配置資訊後,該類將掃描上下文,尋找所有的Advisor。他將這些Advisor應用到所有符合切入點的Bean中。很重要的一點是這個代理建立器只能與Advisor配合使用。該類需要Advisor來知道哪些Bean需要通知。
2.自動代理案例分析
1)BeanNameAutoProxyCreator類自動代理案例剖析
該案例的講解是基於前面講各種通知的例子,這裡只列出配置檔案和測試類(該測試一下測試了以下三種自動代理案例的知識點測試),如果需要參看抽象主題和真實主題,可以去看上一篇部落格spring各種通知的案例講解。
sprin配置檔案:spring-byNameAutoAdvisor.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 建立前置通知 -->
<bean id="beforeAdvice" class="www.csdn.spring.proxy.advice.BeforeAdvice"/>
<!-- 建立後置通知 -->
<bean id="afterAdvice" class="www.csdn.spring.proxy.advice.AfterAdvice"/>
<!-- 建立環繞通知 -->
<bean id="aroundAdvice" class="www.csdn.spring.proxy.advice.AroundAdvice"/>
<!-- 建立異常通知 -->
<bean id="throwAdvice" class="www.csdn.spring.proxy.advice.ThrowAdvice"/>
<!-- 真實主題 目標物件 -->
<bean id="sayServiceImpl" class="www.csdn.spring.proxy.advice.SayServiceImpl"/>
<!-- 配置自動代理操作 -->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<!-- <value>*ServiceImpl</value> -->
<value>*Service*</value>
</list>
</property>
<property name="interceptorNames">
<array>
<value>aroundAdvice</value>
</array>
</property>
</bean>
</beans>
測試類 AutoAdvisorTest.java
package www.csdn.spring.proxy.advice;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AutoAdvisorTest {
@Test
public void testAdvice() {
// 預設自動代理測試
ApplicationContext context = new ClassPathXmlApplicationContext(
"spring-default*.xml");
/*
* 自動代理測試 ApplicationContext context = new
* ClassPathXmlApplicationContext( "spring-byNameAuto*.xml");
*/
SayService sayService = context.getBean("sayServiceImpl",
SayService.class);
sayService.say("嗨!楊凱!");
}
}
2) DefaultAdvisorAutoProxyCreator類自動代理基於靜態切入點案例分析
sprin配置檔案:spring-defaultStaticAutoAdvisor.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 建立前置通知 -->
<bean id="beforeAdvice" class="www.csdn.spring.proxy.advice.BeforeAdvice"/>
<!-- 建立後置通知 -->
<bean id="afterAdvice" class="www.csdn.spring.proxy.advice.AfterAdvice"/>
<!-- 建立環繞通知 -->
<bean id="aroundAdvice" class="www.csdn.spring.proxy.advice.AroundAdvice"/>
<!-- 建立異常通知 -->
<bean id="throwAdvice" class="www.csdn.spring.proxy.advice.ThrowAdvice"/>
<!-- 靜態切入點 -->
<bean id="nameMatchMethodPointcutAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<!-- 織入通知,比如環繞通知 -->
<property name="advice">
<ref bean="aroundAdvice"/>
</property>
<!-- 指明切入點 -->
<property name="mappedName">
<value>say</value>
</property>
</bean>
<!-- 真實主題 目標物件 -->
<bean id="sayServiceImpl" class="www.csdn.spring.proxy.advice.SayServiceImpl"/>
<!-- 配置預設的自動代理操作 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
</beans>
3) DefaultAdvisorAutoProxyCreator類自動代理基於正則切入點案例分析
sprin配置檔案:spring-defaultRegAutoAdvisor.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 建立環繞通知 -->
<bean id="aroundAdvice" class="www.csdn.spring.proxy.advice.AroundAdvice"/>
<!-- 靜態切入點 -->
<bean id="regexpMethodPointcutAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<!-- 織入通知,比如環繞通知 -->
<property name="advice">
<ref bean="aroundAdvice"/>
</property>
<!-- 指明切入點 -->
<property name="patterns">
<!-- .是萬用字元的意思;第一個.*代表匹配任何包名和類名 ;第二個.*代表匹配以say開頭的任意方法-->
<array>
<!--
<value>.*sayH.</value>
<value>.*bye.*</value>
<value>www.*\.SayService\.sayHell.</value>
<value>.+sayH.*</value>
-->
<value>.+sayH\..+</value>
</array>
</property>
</bean>
<!-- 真實主題 目標物件 -->
<bean id="sayServiceImpl" class="www.csdn.spring.proxy.advice.SayServiceImpl"/>
<!-- 配置預設的自動代理操作 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
</beans>
相關文章
- spring心得6--自動裝配知識點講解及案例分析Spring
- DRM 分析及案例講解
- 運維注意事項及案例講解(個人心得)運維
- spring心得8--AOP各種通知案例講解.docSpring
- Spring知識點詳解Spring
- PHP:案例2--商品價格計算(案例分析+設計思路+知識點講解+原始碼+結果展示)PHP原始碼
- vertical-align知識點講解
- Javascript陣列的知識點講解JavaScript陣列
- 常用的資料分析方法及案例講解
- Android Fragment用法知識點的講解AndroidFragment
- Thread執行緒知識點講解thread執行緒
- oracle心得2--單行函式理論講解與案例分析.docOracle函式
- spring知識點概述Spring
- jQuery心得1--jQuery入門知識串講1jQuery
- jQuery心得3--jQuery入門知識串講2jQuery
- spring心得10--使用Aspectj進行AOP開發介紹及案例分析Spring
- Java培訓:Java四大知識點講解Java
- Java四大知識點講解,初學者必看!Java
- OCP知識點講解 之 什麼是Buffer Cache?
- spring心得7--spring第二大特點AOP(面向切面)講解Spring
- Spring AOP 自動建立代理Spring
- spring心得3--bean的生命週期結合案例詳細講解@普通期圖解與uml圖解一併分析SpringBean圖解
- Spring知識點總結Spring
- Windows通用知識講解二Windows
- 通過 Spring AOP 註解實現自動代理Spring
- OCP知識點講解 之 LRU鏈與髒LRU鏈
- OCP知識點講解 之 檢查點佇列與增量檢查點佇列
- Sqlserver關於統計資訊自動建立自動更新的知識點SQLServer
- [心得]UNP知識整理
- 千鋒長沙Java培訓:Spring 相關知識講解JavaSpring
- Spring【AOP模組】知識要點Spring
- 雲端計算學習素材、課件,msyql知識點講解
- react的詳細知識講解!React
- centos系列的啟動流程及基礎知識點CentOS
- Mybatis【逆向工程,快取,代理】知識要點MyBatis快取
- Android小知識-剖析Retrofit前的預備知識(靜態代理與動態代理)Android
- spring-framework的Resource知識點SpringFramework
- 資料庫基礎知識講解資料庫