DefaultAdvisorAutoProxyCreator这个类功能更为强大,这个类的奇妙之处是他实现了BeanProcessor接口,当ApplicationContext读如所有的Bean配置信息后,这个类将扫描上下文,寻找所有的Advistor(一个Advisor是一个切入点和一个通知的组成),将这些Advisor应用到所有符合切入点的Bean中。
工程结构图:
业务接口:
package com.bijian.study; public interface Shopping { public String buySomething(String type); public String buyAnything(String type); public String sellSomething(String type); public String sellAnything(String type); }
业务实现类:
package com.bijian.study; 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 com.bijian.study; 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 com.bijian.study; 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 "); } }
普通Bean类:
package com.bijian.study; public class Customer { private String name; private int age; public Customer(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } }
配置文件:
<?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="com.bijian.study.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="com.bijian.study.ShoppingImplA"> <property name="customer"> <ref bean="customer" /> </property> </bean> <bean id="sellBean" class="com.bijian.study.ShoppingImplB"> <property name="customer"> <ref bean="customer" /> </property> </bean> <bean id="customer" class="com.bijian.study.Customer"> <constructor-arg index="0"> <value>gaoxiang</value> </constructor-arg> <constructor-arg index="1"> <value>26</value> </constructor-arg> </bean> </beans>
我们配置一个advisor,方法和在我的blog关于静态切入点的用正则表达式配置切入点相同,这里匹配的是业务实现类中所有型如:***sell***的方法。
buyBean和sellBean是最为普通的IOC配置,重点在autoProxyCreator中,我们只需配置一个id(id非必需)和class,spring会自动帮我们解析advisor,并将通知进行切入。
测试程序:
package com.bijian.study.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.bijian.study.Shopping; public class TestAdvisor { public static void main(String[] args) { // String filePath=System.getProperty("user.dir")+File.separator+"src"+File.separator+"applicationContext.xml"; // ApplicationContext ctx=new FileSystemXmlApplicationContext(filePath); ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 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"); } }
需要注意的是:和BeanNameAutoProxyCreator相同,我们需要用ApplicationContext获得Bean。运行结果:
gaoxiang bye something success gaoxiang bye anything success Hello welcome to bye gaoxiang sell anything success Hello welcome to bye gaoxiang sell something success
可以看到我们定义的所有***sell***的方法,都被切入了前置通知。
PS:在执行时如报java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice错,是少了aopalliance包,这个包涉及到动态织入。是spring的常用联盟包,必不可少。
相关推荐
spring实现的自动代理配置!用到的关键类org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator
Spring AOP源码01:Jdk动态代理底层源码 Spring AOP源码02:ProxyFactory Spring AOP源码03:JdkDynamicAopProxy Spring AOP源码04:MethodInvocation 拦截器调用 Spring AOP源码05:DefaultAdvisorAutoProxyCreator...
3.6.3 元数据自动代理 3.7 小结 第二部分 Spring在业务层的应用 第4章 征服数据库 4.1 学习Spring的DAO理念 4.1.1 理解Spring的DataAccessException 4.1.2 与DataSource一起工作 4.1.3...
12.8.使用“自动代理”功能 12.8.1.自动代理对象的定义 12.8.1.1.ObjectNameAutoProxyCreator 12.8.1.2.DefaultAdvisorAutoProxyCreator 12.8.1.3.AbstractAutoProxyCreator 12.8.2.使用特性驱动的自动代理 12.9....
7.9. 使用“自动代理(autoproxy)”功能 7.9.1. 自动代理bean定义 7.9.1.1. BeanNameAutoProxyCreator 7.9.1.2. DefaultAdvisorAutoProxyCreator 7.9.1.3. AbstractAdvisorAutoProxyCreator 7.9.2. 使用元数据驱动...
IntroductionInterceptor DelegatingIntroductionInterceptor Autoproxing 自动代理可以让您不用为每一个要被 Advised 的 Target 手动定义代理物件,透过 Bean 名称或是 Pointcut 的比对,自动为...
经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用Spring的各项功能的同时,还能透彻理解Spring的内部实现,真正做到知其然知其所以然。...
经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用Spring的各项功能的同时,还能透彻理解Spring的内部实现,真正做到知其然知其所以然。...
Spring的Ioc Spring的AOP , AspectJ Spring的事务管理 , 三大框架的整合 目录 1.1 Spring 框架学习路线:..........................................................................................................