您的位置:首页 > 运维架构

AOP_2.使用cglib中的Proxy技术实现

2010-06-09 15:43 429 查看
在上篇的基础上创建CglibProxyFactory

package com.umikawa.aop;

import java.lang.reflect.Method;

import com.umikawa.User.User;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CglibProxyFactory implements MethodInterceptor{

	private Object targetObject;
	
	public Object createProxyInstance(Object targetObject) {
		this.targetObject = targetObject;
		Enhancer enhancer = new Enhancer(); // 该类用于生成代理对象
		enhancer.setSuperclass(this.targetObject.getClass()); // 设置父类
		enhancer.setCallback(this); // 设置本身为回调函数
		return enhancer.create(); // 生成代替对象
	}
	
	@Override
	public Object intercept(Object proxy, Method method, Object[] args,
			MethodProxy methodProxy) throws Throwable { // 环绕通知
		
		Object result = null;
		if(User.USER_NAME!=null){// 模拟已经登录
			// ... 方法前执行 - 前置通知
			System.out.println("已成功的拦截到此方法!!登录用户为:"+User.USER_NAME);
			try {
				result = methodProxy.invoke(this.targetObject, args); // 调用目标对象的方法
				// ... 方法后执行 - 后置通知
			} catch (Exception e) {
				// ... 错误执行 - 例外通知
				e.printStackTrace();
			}finally {
				// ... 总是执行 - 最终通知
			}
			
		}else{
			System.out.println("对你不起、你没有权限!");
		}
		return result;
	}

}




在AOPTest类中添加方法

// 模拟用户登录调用方法- cglib
	@Test public void testCglibUserProxy() {
		// 模拟登录
		User.setUSER_NAME("李强");
		
		// 持有目标对象的一个代理
		PersonService personService = 
			(PersonService)new CglibProxyFactory().createProxyInstance(new PersonServiceBean());
		
		// 更新人员
		personService.updatePerson();
		
		
	}
	
	// 模拟用户未登录调用方法操作 - cglib
	@Test public void testCglibNOUserProxy() {
		// 模拟非登录
		User.setUSER_NAME(null);
		
		// 持有目标对象的一个代理
		PersonService personService = 
			(PersonService)new CglibProxyFactory().createProxyInstance(new PersonServiceBean());
		
		// 更新人员
		personService.updatePerson();
		
		
	}




AOP中的概念


1. Aspect(切面)
指横切性关注点的抽象即为切面,它与类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面横切性关注点的抽象.
例子中:业务bean方法 就是切面,当然切面也可以是字段,或者其它,意思也就是从那里下手

2. joinpoint(连接点)
所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点,实际上joinpoint还可以是field或类构造器)
例子中:被拦截的点是一个连接点,那么例子中的连接点是业务bean方法,每个拦截到的都是一个连接点
3. Pointcut(切入点)
所谓切入点是指我们要对那些joinpoint进行拦截的定义.
例子中:也可以说是一个描述吧,“拦截所有的业务bean 方法”就是切入点,只是个定义
4. Advice(通知)
所谓通知是指拦截到joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知
例子中:见CglibProxyFactory类中的注释位置
5. Target(目标对象)
代理的目标对象 例子中:PersonServiceBean就是目标对象
6. Weave(织入)
指将aspects应用到target对象并导致proxy对象创建的过程称为织入.
7. Introduction(引入)
在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.
总结:
以上两种实现AOP编程是Spring AOP的核心,Spring AOP创建代理对象的时候,会检查目标对象是否实现某个接口,如果实现了某个接品就会用JDK中的Proxy技术,反之则用cglib 中的Proxy技术。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: