您的位置:首页 > 编程语言 > Java开发

AOP_1.入门及使用JDK中的Proxy技术实现

2010-06-09 11:28 721 查看
one>> 概念

Aspect Oriented Programming(AOP),面向切面编程



two>> 图例







three>> JDK中的Proxy技术实现 例子

1.描述

拦截业务bean中的所有方法,在调用每个方法前判断客户是否拥有权限,有则调用,没有则作相关的处理



2.步骤

(1)工程图





(2)代码

JDKProxyFactory

package com.umikawa.aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import com.umikawa.User.User;

public class JDKProxyFactory implements InvocationHandler {
	
	//代理的目标对象
	private Object targetObject;
	
	// 创建一个目标对象
	public Object createProxyInstance(Object targetObject){
		this.targetObject = targetObject;
		/*
		* 参数1设置代码使用的类装载器,一般采用跟目标类相同的类装载器
		* 参数2设置代理类实现的接口(所以JDK实现AOP要想业务bean使用代理则必须实现一个接口)
		* 参数3设置回调对象,当代理对象的方法被调用时,会委派给该参数指定对象的invoke方法
		*/
		return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),
				this.targetObject.getClass().getInterfaces(), this);
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {	
		Object result = null;
		
		if(User.USER_NAME!=null){// 模拟已经登录
			System.out.println("已成功的拦截到此方法!!登录用户为:"+User.USER_NAME);
			result = method.invoke(this.targetObject, args); // 调用目标对象的方法
		}else{
			System.out.println("对你不起、你没有权限!");
		}
		
		return result;
	}

}




PersonService

package com.umikawa.service;

public interface PersonService {

	public abstract void updatePerson();

}


PersonServiceBean

package com.umikawa.service.bean;

import com.umikawa.service.PersonService;

public class PersonServiceBean implements PersonService {
	
	/* (non-Javadoc)
	 * @see com.umikawa.service.PersonService#updatePerson()
	 */
	public void updatePerson() {		
		// 模拟数据库更新
		System.out.println("人员更新成功");
	}
	
}


User

package com.umikawa.User;
/*
 * 模拟登录
 */
public class User {
	
	public static String USER_NAME;

	public static String getUSER_NAME() {
		return USER_NAME;
	}

	public static void setUSER_NAME(String uSERNAME) {
		USER_NAME = uSERNAME;
	}

}


AOPTest

package junit.test;

import org.junit.BeforeClass;
import org.junit.Test;

import com.umikawa.User.User;
import com.umikawa.aop.JDKProxyFactory;
import com.umikawa.service.PersonService;
import com.umikawa.service.bean.PersonServiceBean;

public class AOPTest {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}

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




testUserProxy测试结果为:

已成功的拦截到此方法!!登录用户为:李强
人员更新成功

testNOUserProxy测试结果为:

对你不起、你没有权限!



例子可以在我上传的资源里可以找到:

http://search.download.csdn.net/advsearch
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: