前置增强的实例

通过前置增强对服务生的服务用语进行强制规范
1.假设服务生只做两件事:
第一:欢迎顾客
第二:对顾客提供服务
  1. package com.aop2.advice;
  2. public interface Waiter {
  3.     void greetTo(String name);
  4.  
  5.     void serveTo(String name);
  6. }
2.训练不足的服务生的服务情况
  1. package com.aop2.advice;
  2.  
  3. public class NaiveWaiter implements Waiter {
  4.  
  5.     public void greetTo(String name) {
  6.          System.out.println("greet to "+name+" ...");   
  7.     }
  8.  
  9.     public void serveTo(String name) {
  10.         System.out.println("serving to "+name+" ...");
  11.     }
  12. }
说明:
NaiveWaiter只是简单地向顾客打招呼,闷不作声地走到顾客跟前,直接提供服务。
3.下面,我们对NavieWaiter地服务行为进行规范,让他们在打招呼和提供服务之前,都必须先对顾客使用礼貌用语。
  1. package com.aop2.advice;
  2.  
  3. import java.lang.reflect.Method;
  4. import org.springframework.aop.MethodBeforeAdvice;
  5.  
  6. public class GreetingBeforeAdvice implements MethodBeforeAdvice {
  7.  
  8.     public void before(Method method, Object[] args, Object target) throws Throwable {
  9.          String clientName = (String)args[0];
  10.          System.out.println("How are you ! Mr."+clientName+".");
  11.     }
  12. }
4.强制在服务生队伍中应用这个规定
1)使用CGLib代理
  1. package com.aop2.advice;
  2.  
  3. import org.springframework.aop.BeforeAdvice;
  4. import org.springframework.aop.framework.ProxyFactory;
  5.  
  6. //使用CGLib代理
  7. public class AdviceMain {
  8.     public static void main(String[] args){
  9.         Waiter target = new NaiveWaiter();
  10.         BeforeAdvice advice = new GreetingBeforeAdvice();
  11.         //Spring提供的代理工厂
  12.         ProxyFactory pf = new ProxyFactory();
  13.         //设置代理目标
  14.         pf.setTarget(target);
  15.         //为代理目标添加增强
  16.         pf.addAdvice(advice);
  17.         //生成代理实例
  18.         Waiter proxy = (Waiter)pf.getProxy();
  19.         proxy.greetTo("小2");
  20.         proxy.serveTo("明国宾");
  21.         System.out.println("执行完成");
  22.     }
  23. }
2)使用JDK代理
  1. package com.aop2.advice;
  2.  
  3. import org.springframework.aop.BeforeAdvice;
  4. import org.springframework.aop.framework.ProxyFactory;
  5.  
  6. //使用JDK代理
  7. public class AdviceMain2 {
  8.     public static void main(String[] args){
  9.         Waiter target = new NaiveWaiter();
  10.         BeforeAdvice advice = new GreetingBeforeAdvice();
  11.         //Spring提供的代理工厂
  12.         ProxyFactory pf = new ProxyFactory();
  13.         //对指定的接口进行代理
  14.         pf.setInterfaces(target.getClass().getInterfaces());
  15.         //因为JDK代理的性能不高,启用优化
  16.         pf.setOptimize(true);
  17.         //设置代理目标
  18.         pf.setTarget(target);
  19.         //为代理目标添加增强
  20.         pf.addAdvice(advice);
  21.         //生成代理实例
  22.         Waiter proxy = (Waiter)pf.getProxy();
  23.         proxy.greetTo("小2");
  24.         proxy.serveTo("明国宾");
  25.         System.out.println("执行完成");
  26.     }
  27. }
3)使用Spring方式
Spring配置文件:
  1. <bean id="greetingAdvice" class="com.aop2.advice.GreetingBeforeAdvice"/>
  2. <bean id="target" class="com.aop2.advice.NaiveWaiter"/>
  3. <bean id="waiter" class="org.springframework.aop.framework.ProxyFactoryBean"
  4. p:proxyInterfaces="com.aop2.advice.Waiter"
  5. p:interceptorNames="greetingAdvice"
  6. p:target-ref="target">
  7. </bean>
AdviceMain3:
  1. package com.aop2.advice;
  2.  
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5.  
  6. //使用Spring的配置文件
  7. public class AdviceMain3 {
  8.     public static void main(String[] args){
  9.         ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:applicationContext.xml");
  10.         Waiter waiter = (Waiter)ctx.getBean("waiter");
  11.         waiter.greetTo("小2");
  12.         waiter.serveTo("小2");
  13.         System.out.println("执行完成");
  14.     }
  15. }
5.说明:
1)BeforeAdvice接口是前置增强地接口,方法前置增强的MethodBeforeAdvice接口是其子类,
    before(Method method,Object[] args,Object obj) throws Throwable:method为目标类的方法;args为目标类的入参,obj为目标类的实例
2)使用org.springframework.aop.framework.ProxyFactory代理工厂将GreetingBeforeAdvice的增强织入目标类NaiveWaiter中
3)org.springframework.aop.framework.AopProxy接口,并提供了两个类型的实现类
        Cglib2AopProxy使用CGLib代理技术创建代理
        JdkDynamicAopProxy使用JDK代理技术创建代理

4)ProxyFactoryBean是FactoryBean接口的实现类,ProxyFactoryBean负责为其他Bean创建代理实例
常见的可配置属性
target:代理的目标对象
proxyInterfaces:代理所要实现的接口,可以是多个接口。该属性还有一个别名属性interface
interceptorNames:需要植入目标对象的Bean列表,采用Bean的名称指定
这些Bean必须是实现了org.aoplliance.intercept.MethodInterceptor或者org.framework.aop.Advisor,配置中顺序对应调用的顺序;
singleton:返回的代理是否是单实例。默认为单实例
optiomize:当设置为true,强制使用CGLib代理。对于singleton的代理,推荐使用CGLib
proxyTargetClass:是否对类进行代理(而不是对接口进行代理),设置为true,使用CGLib代理







原文地址:https://www.cnblogs.com/xiao2/p/5779391.html