知识大全 Spring自动代理机制

Posted

篇首语:人行千里路,胜读十年书。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Spring自动代理机制相关的知识,希望对你有一定的参考价值。

Spring自动代理机制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  我们一直使用ProxyFactoryBean来显式的创建AOP代理 但是在很多场合 这种方式将会使编写配置文件的工作量大大增加 由于要从ProxyFactoryBean获得代理对象 也会使应用和Spring之间的耦合度增加 下面介绍使用Spring提供的自动代理机制来解决这类问题

   使用BeanNameAutoProxyCreator

  Spring提供的BeanNameAutoProxyCreator类允许我们通过Bean的name属性来指定代理的Bean 它暴露了java lang String[]类型的beanNames和 interceptorNames属性 beanNames可以指定被代理的Bean名字列表 支持 * 通配符 例如 *DAO 表示所有名字以 DAO 结尾的Bean interceptorNames指定通知(Advice)列表 或者通知者(Advisor)列表

  下面通过一个例程来演示如何使用BeanNameAutoProxyCreator 在例子中 有两个Bean TestBeanA和BeanB 并在TestMain类中的main方法中调用其MyMethod()方法 自动代理将会在方法调用前自动的执行配置的前置通知 输出提示信息

  新建一个名字为AOP_Test 的工程 添加Spring的IoC和AOP库后 新建一aop test包 再分别创建两个类TestBeanA和BeanB 添加MyMethod()方法 代码如下

代码   查看源代码copy to clipboard打印
    /**    *     */   package aop test;    /**    * @author zhangyong    *     */   public  class TestBeanA           public  void MyMethod()               System out println( this getClass() getName()                    +  MyMethod() is run! );               
代码   查看源代码copy to clipboard打印
    /**    *     */   package aop test;      /**    * @author zhangyong    *     */   public  class BeanB              public  void MyMethod()              System out println( this getClass() getName()                     +  MyMethod() is run! );              

  再创建前置通知类BeforeAdvice

代码   查看源代码copy to clipboard打印
    /**    *     */   package aop test;      import java lang reflect Method;    import  springframework aop MethodBeforeAdvice;      /**    * @author zhangyong    *     */   public  class BeforeAdvice  implements MethodBeforeAdvice             public  void before(Method method  Object[] args  Object target)                  throws Throwable              System out println(method getName() +  () 将要运行! );               

  最后创建含有main方法的测试类TestMain

代码   查看源代码copy to clipboard打印
    /**    *     */   package aop test;         import ntext ApplicationContext;    import ntext support ClassPathXmlApplicationContext;      /**    * @author zhangyong    *     */   public  class TestMain            public  static  void main(String[] args)              ApplicationContext ac =  new ClassPathXmlApplicationContext(                      applicationContext xml );                     TestBeanA beanA = (TestBeanA)ac getBean( TestBeanA );             beanA MyMethod();             BeanB beanB = (BeanB)ac getBean( BeanB );             beanB MyMethod();                         

  在配置文件中配置Bean和自动代理Bean 完成后代码如下

代码   查看源代码copy to clipboard打印
    <?xml version=  encoding= UTF ?>   <beans ………… >           <bean id= TestBeanA  class= aop test TestBeanA />         <bean id= BeanB  class= aop test BeanB />            <bean id= BeforeAdvice  class= aop test BeforeAdvice ></bean>               <bean class= springframework aop framework autoproxy                           BeanNameAutoProxyCreator >             <property name= beanNames >                 <list>                     <value>Test* </value>                 </list>             </property>             <property name= interceptorNames >                 <list>                     <value>BeforeAdvice </value>                 </list>             </property>         </bean>     </beans>  

  运行主类 输出结果如下

  

  可以看到 在主类TestMain中 我们是直接从Spring IoC容器中获取收管Bean而不是像以前那样从ProxyFactoryBean中获取代理 但是我们的前置通知BeforeAdvice仍然在TestBeanA对象的MyMethod()方法执行前被触发 这说明我们的自动代理正在工作

  

   使用DefaultAdvisorAutoProxyCreator

  DefaultAdvisorAutoProxyCreator允许我们只需定义相应的Advisor通知者 就可以完成自动代理 配置好DefaultAdvisorAutoProxyCreator受管Bean后 它会自动查找配置文件中定义的Advisor 并将它们作用于所有的Bean

  修改例程 的配置文件 使用DefaultAdvisorAutoProxyCreator来完成自动代理 完成后配置文件代码如下(本例完整工程代码见例程 )

代码   查看源代码copy to clipboard打印
    <?xml version=  encoding= UTF ?>   <beans …… >         <bean id= TestBeanA  class= aop test TestBeanA   />         <bean id= BeanB  class= aop test BeanB   />         <bean id= BeforeAdvice  class= aop test BeforeAdvice />         <bean class= springframework aop framework autoproxy                       DefaultAdvisorAutoProxyCreator   />              <bean class= springframework aop support NameMatchMethod                                              PointcutAdvisor >             <property name= advice  ref= BeforeAdvice   />             <property name= mappedNames >                 <list>                     <value>*Method* </value>                 </list>             </property>         </bean>          </beans>  

  运行主类输出结果如下

cha138/Article/program/Java/ky/201311/28048

相关参考

知识大全 spring技术手册上的一个java动态代理例子

  Java代码  publicinterfaceIHello  publicvoidhello(Stringname);    Java代码  publicclassHelloImplimpleme

知识大全 基于Spring实现seam形式的事件机制

基于Spring实现seam形式的事件机制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Sea

保险代理公司的退出机制

保险代理公司的退出机制保险专业代理公司的许可证到期的,或者公司解散、被依法吊销营业执照、被撤销、责令关闭或者被人民法院依法宣告破产的,保险专业代理公司应当从保险中介市场退出。《保险专业代理机构监管规定

知识大全 Spring的自动装配

Spring的自动装配  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  采用构造函数注入以及set

知识大全 Spring自动装配的学习

Spring自动装配的学习  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在xml配置文件中au

知识大全 Spring与自动调度任务

Spring与自动调度任务  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  最近把以前设想做搜索引

知识大全 spring 2.0 的事务自动处理

  <aop:config>       <!<aop:advisorid=userManagerTxad

知识大全 Spring Autowire(自动装载)的一次实践

SpringAutowire(自动装载)的一次实践  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 Java动态代理机制综合分析及扩展

Java动态代理机制综合分析及扩展  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java动态代

知识大全 Spring Autowire(自动装载)的一次实践[2]

SpringAutowire(自动装载)的一次实践[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下