创建增强类

  Spring支持5种类型的增强:

  1).前置增强

    org.springframework.aop.BeforeAdvice代表前置增强.spring目前只支持方法级的增强, 所以MethodBeforeAdvice是目前可用可用的前置增强, 表示在目标方法执行前执行增强.

  2).后置增强

    org.springframework.aop.AfterReturningAdvice代表后置增强, 表示在目标方法返回后实施增强逻辑

  3).环绕增强

    org.aopalliance.intercept.MethodInterceptor表示环绕增强, 在方法执行前后执行增强.

  4).异常抛出增强

    org.springframework.aop.ThrowsAdvice表示异常抛出增强, 在方法抛出异常后实施增强.    

  5).引介增强

    org.springframework.aop.IntroductionInterceptor表示引介增强, 可以在目标类中增加一些新的方法和属性.

这些增强接口都有一些方法, 通过实现这些接口方法, 这方法中定义横切逻辑,就可以将他们织入到目标类方法的相应连接点的位置.

1.前置增强

  下面通过规范服务员的礼貌用于来演示前置增强.

服务员:

package com.bao.bao.aop;

/**
 * Created by xinfengyao on 16-7-4.
 */
public interface Waiter {
    void greetTo(String name);
    void serveTo(String name);
}

一个训练不足的服务员:

package com.bao.bao.aop;

/**
 * Created by xinfengyao on 16-7-4.
 */
public class NaiveWaiter implements Waiter {
    @Override
    public void greetTo(String name) {
        System.out.println("greet to " + name + "...");
    }

    @Override
    public void serveTo(String name) {
        System.out.println("serving " + name + "...");
    }
}

NaiveWaiter服务员只是简单地走到客人面前提供服务, 没有任何礼貌用语. 下面通过前置增强, 来规范服务员的服务行为.

增强逻辑:

package com.bao.bao.aop;

import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;

/**
 * Created by xinfengyao on 16-7-4.
 */
public class GreetingBeforeAdvice implements MethodBeforeAdvice {
    @Override
    public void before(Method method, Object[] args, Object o) throws Throwable {
        String clientName = (String) args[0];
        System.out.println("How are you! Mr." + clientName + ".");
    }
}

BeforeAdvice是前置增强的接口, MethodBeforeAdvice是其子类, MethodBeforeAdvice只定义了一个方法:

  public void before(Method method, Object[] args, Object obj) throws Throwable

method为目标类的方法, args为方法的入参, obj为目标类实例.

礼貌用语的前置增强定义好后, 下面我们将强制规范服务生的礼貌用语

package com.bao.bao.aop;

import org.springframework.aop.BeforeAdvice;
import org.springframework.aop.framework.ProxyFactory;/**
 * Created by xinfengyao on 16-7-4.
 */
public class TestBeforeAdvice {
    public static void main(String[] args) throws Exception {
        Waiter target = new NaiveWaiter();
        BeforeAdvice advice = new GreetingBeforeAdvice();

        ProxyFactory proxyFactory = new ProxyFactory();
        proxyFactory.setTarget(target);
        proxyFactory.addAdvice(advice);

        Waiter proxy = (Waiter) proxyFactory.getProxy();
        proxy.greetTo("John");
        proxy.serveTo("Tom");
    }
}

运行结果:

How are you! Mr.John.
greet to John...
How are you! Mr.Tom.
serving Tom...

正如我们所看到的一样, 礼貌用语得到的实施.

ProxyFactory就是通过JDK代理和CGLIB代理, 将增强织入到目标类中.

spring定义了org.springframework.aop.framework.AopProxy接口,并提供了两个final类型实现类

ProxyFactory的setInterfaces(Class[] Interfaces)指定只对接口进行代理,ProxyFactory就是用JdkDynamicAopProxy;如果是针对类型的代理,则使用Cglib2AopProxy

另外ProxyFactory的setOptimize(true)方法,让ProxyFactory启动优化代理方式,这样,针对接口的代理也会使用Cglib2AopProxy 。

...... 

时间: 2024-10-28 10:47:39

创建增强类的相关文章

(spring-第17回【AOP基础篇】) 创建增强类

一.   增强类包含的信息: a)   横切逻辑(插入的具体代码) b)   部分连接点信息(在方法的哪个位置插入代码,比如方法前.方法后等). 二.   增强的类型 每一种增强有一个需要实现的增强类. a)   前置增强 顾名思义,在目标方法前实施增强. 增强类:org.springframework.aop.MethodBeforeAdvice. 举例,三步走: 1)   第一步,创建目标类接口和目标类: 2)   第二步,实现MethodBeforeAdvice,创建增强类: 3)   第

Spring 创建增强类

Spring 使用增强类定义横切逻辑,同时由于 Spring 只支持方法连接点,增强还包括在方法的哪一点加入横切代码的方位信息,所以增强既包含横切逻辑,又包含部分连接点的信息. 1.增强类型 AOP 联盟为增强定义了 org.aopalliance.aop.Advice 接口,Spring 支持5种类型的增强,先来了解一下增强接口继承关系图,如下图所示. 带 <<spring>> 标识的接口是 Spring 所定义的扩展增强接口:带 <<aoppalliance>

Spring AOP 创建增强类

AOP联盟为增强定义了org.aopalliance.aop.Advice接口,Spring支持5种类型的增强:  1)前置增强:org.springframework.aop.BeforeAdvice 代表前置增强,因为Spring 只支持方法级的增强,所有MethodBeforeAdvice是目前可用的前置增强,表示在目标方法执行前实施增强,而BeforeAdvice是为了将来版本扩展需要而定义的:  2)后置增强:org.springframework.aop.AfterReturning

C#中关于增强类功能的几种方式

C#中关于增强类功能的几种方式 本文主要讲解如何利用C#语言自身的特性来对一个类的功能进行丰富与增强,便于拓展现有项目的一些功能. 拓展方法 扩展方法被定义为静态方法,通过实例方法语法进行调用.方法的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀.仅当使用 using 指令将命名空间显式导入到源代码中之后,扩展方法才可使用. namespace Extensions { public static class StringExtension { public stati

创建多线程类

# -*- coding: cp936 -*- #python 27 #xiaodeng #http://www.cnblogs.com/fnng/p/3489321.html #创建多线程类 import threading from time import sleep,ctime class MyThread(threading.Thread):#threading.Thread '创建MyThread类,用于继承threading.Thread类.' def __init__(self,f

如何:从代码创建 UML 类图(ZZ)

您拖动的一个或多个类将显示在关系图上. 它们依赖的类将显示在"UML 模型资源管理器"中. 参见 模型表示类型的方式. 将程序代码中的类添加到 UML 模型 打开一个 C# 项目. 将一个 UML 类图.解决方案: 在"体系结构"菜单上,选择"新建关系图". 在"添加新关系图"对话框中选择"UML 类图". 如果您还没有,将建模项目创建. 打开"体系结构资源管理器": 在"体系

创造自己的群集类型----之----创建“包装”类以封装预定义集群类型

第一步:创建"包装"类以封装预定义集群类型 public class EncapsulatePredefinedCluster { private ArrayList students; public EncapsulatePredefinedCluster() { students = new ArrayList(5); } /// <summary> /// 注册新生 /// </summary> /// <param name="s&quo

创建一个类

c++是一门面向对象的编程语言,而面向对象的基础就是类 使用C++创建一个Student类 class Student//学生类 { private://私有 //数据成员 char Name[10];//姓名 int Age;//年龄 int No;//学号 public://公有 //成员函数 //输入学生的信息 void InputStudent(char *name, int age, int no) { strcpy(Name, name); Age = age; No = no; }

利用MyEclipse自动创建PO类、hbm文件(映射文件)、DAO

前提条件:表sjzdfl  表sjzdxx (使用数据库MySQL) 表sjzdfl (两个字段sjzdflId 和 sjzdflmc) 表sjzdfl 建表语句: [sql] view plaincopy DROP TABLE IF EXISTS `sjzdfl`; CREATE TABLE `sjzdfl` ( `sjzdflId` int(11) NOT NULL auto_increment, `sjzdflmc` varchar(255) default NULL, PRIMARY K