zoukankan      html  css  js  c++  java
  • 前置增强的实例

    通过前置增强对服务生的服务用语进行强制规范
    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代理







  • 相关阅读:
    C# 关键字 之 virtual
    Set NOCOUNT 和 SET XACT_ABORT
    radl+ReportViewer (转)
    销售利润分析案例
    实现动态展现报表:2种开发思路
    jdk,tomcat,myecplise程序安装步骤
    BI报表工具选型的整理总结
    MyEclipse 快捷键
    oracle biee
    跨数据库
  • 原文地址:https://www.cnblogs.com/xiao2/p/5779391.html
Copyright © 2011-2022 走看看