首页 > 编程 > 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,所以使用时要格外小心。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表