http://blog.csdn.net/yerenyuan_pku/article/details/52863780

AOP技术在企业开发中或多或少都会用到,但用的最多的大概就是做权限系统时,在做权限系统时,我们可能需要粗粒度的权限控制和细粒度的权限控制,对于细粒度的权限控制,我们主要是对方法进行拦截,对方法进行拦截之后,判断用户是否是有权限,有权限就执行该方法,没有权限就不能执行该方法。 
现在我们借助一个例子来说明怎么使用JDK中的Proxy技术来实现AOP功能,并且不借助任何其他的框架。 
首先新建一个普通的Java Project,名称为AOP。接着在src目录下新建一个it.cast.service包,并在该包下创建PersonService接口,其代码为:

public interface PersonService {
public void save(String name);
public void update(String name, Integer personid);
public String getPersonName(Integer personid);
}
  • 1

紧接着在src目录下新建一个it.cast.service.impl包,并在该包下创建PersonService接口的实现类——PersonServiceBean.java,其代码为:

public class PersonServiceBean implements PersonService {
private String user = null; public String getUser() {
return user;
} public PersonServiceBean() {} public PersonServiceBean(String user) {
this.user = user;
} public void save(String name) {
System.out.println("我是save()方法");
} public void update(String name, Integer personid) {
System.out.println("我是update()方法");
} public String getPersonName(Integer personid) {
System.out.println("我是getPersonName()方法");
return "xxx";
}
}
  • 1

现在提出这样一个需求:

  1. 拦截所有业务方法。
  2. 判断用户是否有权限,有权限就允许他执行业务方法,没有权限就不允许他执行业务方法。(是否有权限是根据user是否为null作为判断依据的)

为实现这样的业务需求,可能有人这样写:

public class PersonServiceBean implements PersonService {
private String user = null; public String getUser() {
return user;
} public PersonServiceBean() {} public PersonServiceBean(String user) {
this.user = user;
} public void save(String name) {
if (user != null) {
System.out.println("我是save()方法");
}
} public void update(String name, Integer personid) {
if (user != null) {
System.out.println("我是update()方法");
}
} public String getPersonName(Integer personid) {
if (user != null) {
System.out.println("我是getPersonName()方法");
}
return "xxx";
}
}
  • 1

很显然这样做非常不妥,于是我们就要另寻他路,这个时候很容易想到动态代理技术,对于动态代理技术如有不甚清楚的,可以翻阅我的笔记动态代理(一)——动态代理入门。现在我们就使用JDK中的Proxy技术来生成PersonServiceBean对象的代理对象,但要记住在Java里面有这样一个约定:要想创建某一个对象的代理对象,那么该对象必须实现一个接口。 
在src目录下新建一个it.cast.aop包,并在该包下新建一个类——JDKProxyFactory.java,专门用于创建代理对象,其代码为:

public class JDKProxyFactory implements InvocationHandler {
private Object targetObject; // 代理的目标对象 public Object createProxyInstance(Object targetObject) {
this.targetObject = targetObject;
/*
* 第一个参数设置代码使用的类装载器,一般采用跟目标类相同的类装载器
* 第二个参数设置代理类实现的接口
* 第三个参数设置回调对象,当代理对象的方法被调用时,会委派给该参数指定对象的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 {
PersonServiceBean bean = (PersonServiceBean)this.targetObject;
Object result = null;
if (bean.getUser() != null) { // 有权限
result = method.invoke(targetObject, args); // 把方法调用委派给目标对象
}
return result;
}
}
  • 1

结论:当目标类实现了一个接口,我们就可以使用JDK的Proxy来生成代理对象。 
最后在src目录下新建一个juint.test包,在该包下新建一个单元测试类——AOPTest.java。我们先将该类的代码写为:

public class AOPTest {

    @Test
public void proxyTest() {
JDKProxyFactory factory = new JDKProxyFactory();
PersonService service = (PersonService) factory.createProxyInstance(new PersonServiceBean("xxx"));
service.save("888");
} }
  • 1

测试proxyTest()方法,Eclipse控制台会打印: 
 
若将AOPTest类的代码改为:

public class AOPTest {

    @Test
public void proxyTest() {
JDKProxyFactory factory = new JDKProxyFactory();
PersonService service = (PersonService) factory.createProxyInstance(new PersonServiceBean());
service.save("888");
} }
  • 1

再次测试proxyTest()方法,会发现Eclipse控制台什么也不会打印。

(转)使用JDK中的Proxy技术实现AOP功能的更多相关文章

  1. JDK中的Proxy技术实现AOP功能

    1.需求,用户在执行某个业务方法时我们需要对这个用户进行判断是否具有权限(或者说用户是否登录了)? 例如修改用户信息,我们在update()方法前判断当前用户user是否为null(表示没有权限或者没 ...

  2. SpringBoot中使用LoadTimeWeaving技术实现AOP功能

    目录 1. 关于LoadTimeWeaving 1.1 LTW与不同的切面织入时机 1.2 JDK实现LTW的原理 1.3 如何在Spring中实现LTW 2. Springboot中使用LTW实现A ...

  3. JAVA中的代理技术(静态代理和动态代理)

    最近看书,有两个地方提到了动态代理,一是在Head First中的代理模式,二是Spring AOP中的AOP.所以有必要补充一下动态代理的相关知识. Spring采用JDK动态代理和CGLib动态代 ...

  4. 初探Java设计模式4:JDK中的设计模式

    JDK中设计模式 本文主要是归纳了JDK中所包含的设计模式,包括作用和其设计类图.首先来个总结,具体的某个模式可以一个一个慢慢写,希望能对研究JDK和设计模式有所帮助.一.设计模式是什么(1)反复出现 ...

  5. JDK中的设计模式

    Creational(创建模式) Abstract factory: 创建一组有关联的对象实例.这个模式在JDK中也是相当的常见,还有很多的framework例如Spring.我们很容易找到这样的实例 ...

  6. (转载)JDK中的设计模式

    写的很好,学习道路更轻松一些 原文地址:http://blog.csdn.net/gtuu0123/article/details/6114197 JDK中设计模式 分类: Java相关 设计模式 2 ...

  7. Binder Proxy技术方案

    Binder Proxy技术方案 作者 低端码农 时间 2014.08.23 0x0 看到有多朋友尝试通过hook系统进程system_process的ioctl,以企图截获系统的IPC通讯.这个方法 ...

  8. JDK中所包含的设计模式

    本文主要是归纳了JDK中所包含的设计模式,包括作用和其设计类图.首先来个总结,具体的某个模式可以一个一个慢慢写,希望能对研究JDK和设计模式有所帮助. 一.设计模式是什么(1)反复出现问题的解决方案( ...

  9. 第89节:Java中的反射技术

    第89节:Java中的反射技术 反射技术是动态的获取指定的类,和动态的调用类中的内容(没有类前就可以创建对象,将对象的动作完成,这就是动态的获取指定的类). 配置文件把具体实现的类名称定义到配置文件中 ...

随机推荐

  1. Java中的ArrayList

    ArrayList是所谓的动态数组.用一个小例子: import java.util.ArrayList; import java.util.Iterator; import java.util.Li ...

  2. BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组

    BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组 Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , , 之后, ...

  3. JAVA编程思想中总结的与C++的区别

    Java和C++都是面向对象语言.也就是说,它们都能够实现面向对象思想(封装,继乘,多态).而由于c++为了照顾大量的C语言使用者,而兼容了C,使得自身仅仅成为了带类的C语言,多多少少影响了其面向对象 ...

  4. JavaScript-Tool:Uploadify-un

    ylbtech-JavaScript-Tool:Uploadify 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部 0. http://www.uploadify ...

  5. web_html-day1

    概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器 ...

  6. k8s-部署dashboard1.10.1-十七

    一.获取镜像和填坑 我的k8s是1.13.1,这里dashboard用的1.10.1: 由于国内不能访问Google,而且大部分人可能也没有其他途径访问:只能在阿里云或者其他镜像网站上获取了: 镜像获 ...

  7. 任务38:JWT 设计解析及定制

    任务38:JWT 设计解析及定制 改造jwt token token的值不放在Authorize里面,而是放在header的token里面 asp.net core的源代码 在Security的下面 ...

  8. 2016 Multi-University Training Contest 3 1011【鸽巢原理】

    题解: 坐标(0,m)的话,闭区间,可能一共有多少曼哈顿距离? 2m 但是给一个n,可能存在n(n+1)/2个曼哈顿距离 所以可以用抽屉原理了 当n比抽屉的数量大,直接输出yes 不用计算 那...N ...

  9. P4171 [JSOI2010]满汉全席(2-SAT)

    传送门 2-SAT裸题 把每一道菜拆成两个点分别表示用汉式或满式 连边可以参考板子->这里 然后最尴尬的是我没发现$n<=100$然后化成整数的时候只考虑了$s[1]$结果炸掉了2333 ...

  10. PHPmail 亲测可用

    2017年5月8日9:10:47 1.在模块的配置文件中加入下里面代码,账号最好用126邮箱'THINK_EMAIL' => array( 'SMTP_HOST' => 'smtp.163 ...