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

one>>  概念

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

 

two>> 图例

AOP_1.入门及使用JDK中的Proxy技术实现_第1张图片

 

 

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

1.描述

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

 

2.步骤

(1)工程图

AOP_1.入门及使用JDK中的Proxy技术实现_第2张图片

 

(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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(AOP,jdk,exception,object,String,Class)