使用BeanNameAutoProxyCreator实现spring的自动

系统 1495 0

提到代理,我们可以使用ProxyBeanFactory,并配置proxyInterfaces,target和interceptorNames实现,但如果需要代理的bean很多,无疑会对spring配置文件的编写带来繁重的工作

Spring为我们提供了,根据beanName匹配后进行自动代理的解决方法

业务接口

 

package  AutoProxyOne;

public   interface  Shopping  ... {
  
public  String buySomething(String type);
  
public  String buyAnything(String type);
  
public  String sellSomething(String type);
  
public  String sellAnything(String type);


}

 业务实现类A,作为配置文件中的buyBean:

 

package  AutoProxyOne;

public   class  ShoppingImplA  implements  Shopping  ... {
    
private  Customer customer;
    
public  Customer getCustomer()  ... {
        
return  customer;
    }

    
public   void  setCustomer(Customer customer)  ... {
        
this .customer  =  customer;
    }

    
public  String buySomething(String type)  ... {
        System.out.println(
this .getCustomer().getName() + "  bye  " + type + "  success " );
        
return   null ;
    }

    
    
public  String buyAnything(String type)  ... {
       System.out.println(
this .getCustomer().getName() + "  bye  " + type + "  success " );
       
return   null ;

     }

    
public  String sellAnything(String type)  ... {
        System.out.println(
this .getCustomer().getName() + "  sell  " + type + "  success " );
        
return   null ;
    }

    
public  String sellSomething(String type)  ... {
         System.out.println(
this .getCustomer().getName() + "  sell  " + type + "  success " );
           
return   null ;
    }


}

 

 业务实现类B,作为配置文件中的sellBean:

 

package  AutoProxyOne;

public   class  ShoppingImplB  implements  Shopping  ... {
    
private  Customer customer;
    
public  Customer getCustomer()  ... {
        
return  customer;
    }

    
public   void  setCustomer(Customer customer)  ... {
        
this .customer  =  customer;
    }

    
public  String buySomething(String type)  ... {
        System.out.println(
this .getCustomer().getName() + "  bye  " + type + "  success " );
        
return   null ;
    }

    
    
public  String buyAnything(String type)  ... {
       System.out.println(
this .getCustomer().getName() + "  bye  " + type + "  success " );
       
return   null ;

     }

    
public  String sellAnything(String type)  ... {
        System.out.println(
this .getCustomer().getName() + "  sell  " + type + "  success " );
        
return   null ;
    }

    
public  String sellSomething(String type)  ... {
         System.out.println(
this .getCustomer().getName() + "  sell  " + type + "  success " );
           
return   null ;
    }


}

 

切面通知:

 

package  AutoProxyOne;

import  java.lang.reflect.Method;

import  org.springframework.aop.MethodBeforeAdvice;
// 前置通知
public   class  WelcomeAdvice  implements  MethodBeforeAdvice  ... {

    
public   void  before(Method method, Object[] args, Object obj)
            
throws  Throwable  ... {
        
        System.out.println(
" Hello welcome to bye  " );

    }


}

 

配置文件:

其中beanNames为buy*,意味着所有以buy开头的bean,都被spring容易自动代理,执行相应的切面通知

 

<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"  >
< beans >
 
< bean  id ="WelcomeAdvice"  class ="AutoProxyOne.WelcomeAdvice" >
 
</ bean >
 
 
< bean   class ="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" >
   
< property  name ="beanNames" >
     
< list >
       
< value > buy* </ value >
     
</ list >
   
</ property >
   
< property  name ="interceptorNames" >
     
< list >
        
< value > WelcomeAdvice </ value >
     
</ list >  
   
</ property >

 
</ bean >
   
  
< bean  id ="buyBean"  class ="AutoProxyOne.ShoppingImplA" >
    
< property  name ="customer" >
      
< ref  bean ="customer" />
    
</ property >
   
</ bean >
 
< bean  id ="sellBean"  class ="AutoProxyOne.ShoppingImplB" >
    
< property  name ="customer" >
      
< ref  bean ="customer" />
    
</ property >
   
</ bean >


< bean  id ="customer"  class ="AutoProxyOne.Customer" >
   
< constructor-arg  index ="0" >
     
< value > gaoxiang </ value >
   
</ constructor-arg >
    
< constructor-arg  index ="1" >
     
< value > 26 </ value >
   
</ constructor-arg >
 
</ bean >


</ beans >

 

测试代码:

在测试代码中,我们的buyBean打印两条买的信息,sellBean打印两条卖的信息,可以看到buyBean执行的方法已经进行了切面处理

需要注意的是,如果使用自动代码,则获得Spring Bean工厂要用

ApplicationContext ctx=new FileSystemXmlApplicationContext(filePath);

而不能用

BeanFactory factory=new XmlBeanFactory(new FileSystemResource(filePath));

原因我想是因为BeanFactory在初始化时并不实例化单例的Bean,而ApplicationContext则在初始化时候全部实例化了Bean,自动代理需要在初始化时候定义好代理关系

 

package  AutoProxyOne;

import  java.io.File;

import  org.springframework.beans.factory.BeanFactory;
import  org.springframework.beans.factory.xml.XmlBeanFactory;
import  org.springframework.context.ApplicationContext;
import  org.springframework.context.support.FileSystemXmlApplicationContext;
import  org.springframework.core.io.FileSystemResource;


import  org.springframework.aop.support.RegexpMethodPointcutAdvisor;
public   class  TestAdvisor  ... {

    
public   static   void  main(String[] args)  ... {

        String filePath
= System.getProperty( " user.dir " ) + File.separator + " AutoProxyOne " + File.separator + " hello.xml " ;
        
        BeanFactory factory
= new  XmlBeanFactory( new  FileSystemResource(filePath));
        ApplicationContext ctx
= new  FileSystemXmlA

使用BeanNameAutoProxyCreator实现spring的自动代理


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论