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