Spring AOP 初探 (一)

2014-11-24 11:49:45 · 作者: · 浏览: 12

AOP: Aspect Oriented Programming 面向切面编程
面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AOP是OOP的延续
主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。
主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

-------摘选自百度百科
下面针对安全控制这一功能实现一个简单的AOP应用。
假如现在我们需要开发一个会员注册系统,为了简单起见,该系统只有注册和注销两个功能。考虑到安全因素,只有管理员才有权限使用该功能。下面是我们系统的一个注册系统接口。(面向接口编程比面向类编程更好!)
[java]
package org.spring.tutorial;
/**
* 注册系统
*/
public interface RegisterSystem {
/**
* 注册会员
* @param name 会员名称
*/
void register(String name);
/**
* 注销会员
* @param name 会员名称
*/
void unRegister(String name);
}

package org.spring.tutorial;
/**
* 注册系统
*/
public interface RegisterSystem {
/**
* 注册会员
* @param name 会员名称
*/
void register(String name);
/**
* 注销会员
* @param name 会员名称
*/
void unRegister(String name);
}
该接口声明了两个协议,即注册和注销,它的每个子类必须实现这两个方法。
下面给出一个具体的注册系统。
[java]
package org.spring.tutorial;
/**
* 一个具体的注册系统
*/
public class RegisterSystemImpl implements RegisterSystem {
@Override
public void register(String name) {
System.out.println("判断是否为管理员...");
System.out.println("会员:" + name + "注册成功!");
}
@Override
public void unRegister(String name) {
System.out.println("判断是否为管理员...");
System.out.println("会员:" + name + "注销成功!");
}
}

package org.spring.tutorial;
/**
* 一个具体的注册系统
*/
public class RegisterSystemImpl implements RegisterSystem {
@Override
public void register(String name) {
System.out.println("判断是否为管理员...");
System.out.println("会员:" + name + "注册成功!");
}
@Override
public void unRegister(String name) {
System.out.println("判断是否为管理员...");
System.out.println("会员:" + name + "注销成功!");
}
}
这个具体的注册系统实现了接口给出的两个协议,在进行注册和注销两个操作时,会判断操作者是否有相应的权限(是否为管理员),然后才能继续业务逻辑操作。这种方法实现看起来有点让人不舒服,因为安全控制和业务逻辑混合在了一起,而且存在部分代码冗余现象。通过观察可以知道,这两个方法有共同的地方,即安全控制代码,我们可以把相同的部分提取出来,利用AOP来实现安全控制。
我们将安全控制的代码移除,修改后的注册系统实例如下:
[java]
package org.spring.tutorial;
/**
* 一个具体的注册系统
*/
public class RegisterSystemImpl implements RegisterSystem {
@Override
public void register(String name) {
System.out.println("会员:" + name + "注册成功!");
}
@Override
public void unRegister(String name) {
System.out.println("会员:" + name + "注销成功!");
}
}

package org.spring.tutorial;
/**
* 一个具体的注册系统
*/
public class RegisterSystemImpl implements RegisterSystem {
@Override
public void register(String name) {
System.out.println("会员:" + name + "注册成功!");
}
@Override
public void unRegister(String name) {
System.out.println("会员:" + name + "注销成功!");
}
}
这样,每个方法只需关注业务逻辑,而无需费心其它系统功能。接下来,我们需要编写一个安全控制类。
[java]
package org.spring.tutorial;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

/**
* 安全控制类
*
*/
public class SafeControl implements MethodBeforeAdvice {

@Override
public void before(Method method, Object[] args, Object target)
throws Throwable {
System.out.println("判断是否为管理员.