使用DefaultAdvisorAutoProxyCreator实现spring的自动代理

DefaultAdvisorAutoProxyCreator这个类功能更为强大,这个类的奇妙之处是他实现了BeanProcessor接口,当ApplicationContext读如所有的Bean配置信息后,这个类将扫描上下文,寻找所有的Advistor(一个Advisor是一个切入点和一个通知的组成),将这些Advisor应用到所有符合切入点的Bean中

业务接口:

 

package  StaticAdvisorTest;

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

}

 

业务实现类:

 

package  AutoProxyTwo;

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;
    }


}



package  AutoProxyTwo;

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  AutoProxyTwo;

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 ");

    }


}

 

配置文件:

我们配置一个advisor,方法和在我的blog关于静态切入点的用正则表达式配置切入点相同,这里匹配的是业务实现类中所有型如:***sell***的方法

buyBean和sellBean是最为普通的IOC配置

重点在autoProxyCreator中,我们只需配置一个id和class,spring会自动帮我们解析advisor,并将通知进行切入

<? 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 ="AutoProxyTwo.WelcomeAdvice" >
 
</ bean >
 
 
<!--  自动代理所有的advisor  -->
 
< bean  id ="autoProxyCreator"  class ="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" >
 
</ bean >
   
   
   
< bean  id ="advisor"  class ="org.springframework.aop.support.RegexpMethodPointcutAdvisor" >
     
< property  name ="pattern" >
       
< value > .*sell.+ </ value >    <!--  业务实现方法名匹配  -->
     
</ property >
     
< property  name ="advice" >
       
< ref  bean ="WelcomeAdvice" />
     
</ property >
   
</ bean >
   
   
  
< bean  id ="buyBean"  class ="AutoProxyTwo.ShoppingImplA" >
    
< property  name ="customer" >
      
< ref  bean ="customer" />
    
</ property >
   
</ bean >
  
< bean  id ="sellBean"  class ="AutoProxyTwo.ShoppingImplB" >
    
< property  name ="customer" >
      
< ref  bean ="customer" />
    
</ property >
   
</ bean >


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


</ beans >

 

测试程序:

需要注意的是,和BeanNameAutoProxyCreator相同,我们需要用ApplicationContext获得Bean

package  AutoProxyTwo;

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;
public   class  TestAdvisor  {

    
public static void main(String[] args) {

        String filePath
=System.getProperty("user.dir")+File.separator+"AutoProxyTwo"+File.separator+"hello.xml";
        
        BeanFactory factory
=new XmlBeanFactory(new FileSystemResource(filePath));
        ApplicationContext ctx
=new FileSystemXmlApplicationContext(filePath);
        Shopping shoppingA
=null;
        Shopping shoppingB
=null;
        
        shoppingA
=(Shopping)ctx.getBean("buyBean");
        shoppingB
=(Shopping)ctx.getBean("sellBean");
        shoppingA.buySomething(
"something");
        shoppingA.buyAnything(
"anything");
        shoppingB.sellAnything(
"anything");
        shoppingB.sellSomething(
"something");

        
    

    }

}

 

运行结果:

可以看到我们定义的所有***sell***的方法,都被切入了前置通知

gaoxiang bye something success
gaoxiang bye anything success
Hello welcome to bye
gaoxiang sell anything success
Hello welcome to bye
gaoxiang sell something success

你可能感兴趣的:(spring,bean,正则表达式,null,Class,import)