国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JSP > 正文

Spring 自動代理創建器詳細介紹及簡單實例

2020-07-27 21:25:07
字體:
來源:轉載
供稿:網友

Spring 自動代理創建器

前言:

在經典的spring Aop中,可以手工為目標Bean創建代理Bean,配置文件必須為每一個需要增強的Bean聲明一個代理,結果配置文件里聲明了大量的代理Bean。

在經典的Spring Aop中,Spring提供了自動代理創建器(Aotu proxy creator),有了自動代理創建器,就不再需要使用ProxyFactoryBean手工地創建代理了。

接口Animal和Book:


 package com.zzj.aop; public interface Animal { public void eat(); public void drink(); }
package com.zzj.aop;  public interface Book {  public void read(); } 

目標類:

package com.zzj.aop;  public class Human implements Animal, Book{  @Override  public void eat() {   System.out.println("eat...");  }   @Override  public void drink() {   System.out.println("drink...");  }   @Override  public void read() {   System.out.println("read...");  } } 

前置通知和后置通知:

package com.zzj.aop;  import java.lang.reflect.Method;  import org.springframework.aop.MethodBeforeAdvice;  public class MethodBefore implements MethodBeforeAdvice {   public void before(Method arg0, Object[] arg1, Object arg2)    throws Throwable {   System.out.println("before " + arg0.getName());  }  } 
package com.zzj.aop;  import java.lang.reflect.Method;  import org.springframework.aop.AfterReturningAdvice;  public class MethodAfter implements AfterReturningAdvice {   public void afterReturning(Object arg0, Method arg1, Object[] arg2,    Object arg3) throws Throwable {   System.out.println( "after " + arg1.getName());  }  } 

Spring配置文件:

<?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="human" class="com.zzj.aop.Human"></bean>     <!-- 定義通知 -->   <bean id="beforeAdvice" class="com.zzj.aop.MethodBefore"></bean>   <bean id="afterAdvice" class="com.zzj.aop.MethodAfter"></bean>     <!-- 定義切入點 -->   <bean id="methodNamePointcut"    class="org.springframework.aop.support.NameMatchMethodPointcut">    <property name="mappedNames">     <list>      <value>eat</value>      <value>read</value>     </list>    </property>   </bean>     <!-- 定義后置增強器(關聯通知和切入點) -->   <bean id="AfterMethodNameAdvisor"    class="org.springframework.aop.support.DefaultPointcutAdvisor">    <property name="advice" ref="afterAdvice"></property>    <property name="pointcut" ref="methodNamePointcut"></property>   </bean>   <!-- 定義前置增強器(關聯通知和切入點) -->   <bean id="BeforeMethodNameAdvisor"    class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor">    <property name="advice" ref="beforeAdvice"></property>    <property name="expression">     <value>execution(* *.*in*(..))</value><!-- 可匹配drink -->    </property>   </bean>     <!-- 定義自動代理創建器 -->   <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">    <property name="beanNames">     <list>      <value>*human</value>     </list>    </property>    <property name="interceptorNames">     <list>      <value>AfterMethodNameAdvisor</value>      <value>BeforeMethodNameAdvisor</value>     </list>    </property>   </bean> </beans> 

以上自動代理器可以為以human結尾的Bean創建代理。

測試:

package com.zzj.aop;  import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;  public class Test {   /**   * @param args   */  public static void main(String[] args) {   ApplicationContext context = new ClassPathXmlApplicationContext(     "applicationContext.xml");   Animal animal = (Animal) context.getBean("human");   Book book = (Book) animal;   animal.eat();   animal.drink();   book.read();   }  } 

輸出:

eat... after eat before drink drink... read... after read 

Spring還提供了另一個自動代理創建器:DefaultAdvisorAutoProxyCreator。這個自動代理創建器不需要任何配置,他會自動檢查Ioc容器里聲明的每一個增強器和Bean。如果存在與增強器切入點匹配的的Bean,那么DefaultAdvisorAutoProxyCreator將自動為其創建代理。

<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/> 

需要注意的是,DefaultAdvisorAutoProxyCreator可能會代理那些不希望被代理的目標Bean,所以使用時要格外小心。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南阳市| 博乐市| 清流县| 恩施市| 德安县| 金堂县| 莎车县| 罗江县| 林芝县| 南江县| 涡阳县| 乌海市| 长乐市| 前郭尔| 文安县| 仲巴县| 济阳县| 建昌县| 吴忠市| 湘潭市| 林口县| 毕节市| 肃南| 抚远县| 临颍县| 福贡县| 西乌| 庆安县| 孙吴县| 前郭尔| 石棉县| 南京市| 长阳| 鄱阳县| 南皮县| 福鼎市| 确山县| 彭山县| 吉木乃县| 淮阳县| 茌平县|