AOP_运用JDK中的Proxy技术实现AOP功能
AOP__使用JDK中的Proxy技术实现AOP功能
AOP主要用于权限的验证
细粒度的权限控制:对方法进行拦截,判断用户是否用权限,假如有权限,则允许用户访问被拦截的方法
粗粒度的权限控制:
机制:方法——代理对象——目标对象
实例:使用JDK中的Proxy技术实现AOP功能模拟AOP的机制(不使用任何AOP框架)
局限性:目标对象PersonServiceImp需要实现接口
PersonService.java
package com.qh.service; //接口 public interface PersonService { public void save(String name); public void update(String name, int id); public String getPersonName(int id); }
PersonServiceImp.java
/** * 业务层,被拦截对象 */ package com.qh.service.imp; import com.qh.service.PersonService; public class PersonServiceImp implements PersonService { String user = null;//用户 // 获得用户信息的方法 public String getUser() { return user; } public PersonServiceImp() { } public PersonServiceImp(String user) { this.user = user; } public void save(String name) { System.out.println("我是save()方法"); } public void update(String name, int id) { System.out.println("我是update()方法"); } public String getPersonName(int id) { return "我是getPersonName()方法"; } }
JDKProxyFactory.java
/* * proxy工厂,拦截所有业务方法,判断user是否为null,为null,则没有权限访问方法 */ package com.qh.aop; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import com.qh.service.imp.PersonServiceImp; public class JDKProxyFactory implements InvocationHandler {// 实现接口 private Object targetObject;// 目标对象 /* * 创建一个Proxy实例,参数说明:获得目标类的装载、代理对象实现的接口、 * 回调(当实现前两个参数后,调用类的拦截方法(invoke()方法)) */ public Object createProxyIntance(Object targetObject) { this.targetObject = targetObject; return Proxy.newProxyInstance(this.targetObject.getClass() .getClassLoader(), this.targetObject.getClass().getInterfaces(), this); } //此方法是接口InvocationHandler中的方法,是Proxy的核心方法 // 参数说明:代理对象、拦截的方法、拦截方法的输入参数 public Object invoke(Object poxy, Method method, Object[] args) throws Throwable { PersonServiceImp personServiceImp = (PersonServiceImp) this.targetObject; Object result = null; if (personServiceImp.getUser() != null) { // 将拦截的方法委派给目标对象 result = method.invoke(this.targetObject, args); } return result; } }
Test.java
package com.qh.test; import org.junit.Test; import com.qh.aop.JDKProxyFactory; import com.qh.service.PersonService; import com.qh.service.imp.PersonServiceImp; public class AOPTest { @Test public void test() { JDKProxyFactory factory = new JDKProxyFactory(); //用接口创建对象 PersonService personServiceImp = (PersonService) factory .createProxyIntance(new PersonServiceImp("aa"));//传入目标对象 personServiceImp.save("fdf"); } }