关于Spring的AOP也是Spring的非常重要的一项技术。大致上可以这样说,面向切面编程,它的出现说明可以在不修改代码的情况下实现对功能的增强。而增强就是给一个方法增加一些功能。AOP主要思想就是把增强的代码可以单独写成一个方法。比如说想对某个方法增加一个检测权限的功能,就可以单独写成一个checkPrivilege方法。可以在需要被增强的方法执行之前,自动的让checkPriviliege方法执行,就像在这个方法前形成一个切面,在切面出安装一个checkPriviliege方法。最终在没有修改源代码的情况下实现功能增强了。这就是它的一个思想,其Spring中的AOP实现有两种方式。分别是JDK代理和Cglib代理。先说说JDK代理:它只能对实现接口的类产生代理。

接口:

public interface PostCard {
public void soup();
}

类实现以上接口:

@Service("postCard")
public class PostCardImpl implements PostCard{ public void soup() {
System.out.println("我是postcard...");
} }

创建代理类,该类必须要实现InvocationHandler接口,代码如下:

/*
* 动态代理实现
* */ public class JdkProxy implements InvocationHandler{ private PostCard postCard; //增强的目标 /*
* 构造方法
* */
public JdkProxy(PostCard postCard) {
super();
this.postCard = postCard;
} /*
* 利用JDK代理动态生成对象的方法
* newProxyInstance的三个参数
* loader:目标类的加载器
* interfaces:目标类所实现的接口
* handler:回调
* */
public PostCard create(){
PostCard proxy = (PostCard) Proxy.newProxyInstance(postCard.getClass().getClassLoader(), postCard.getClass().getInterfaces(), this);
return proxy;
} /*
* 执行目标对象的方法
* */
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("检测功能before"); // 调用目标方法
Object result = method.invoke(postCard, args); System.out.println("检测功能after"); return result;
}
}

测试:

    @Test
public void test() { // 实例化目标对象
PostCard cardImpl = new PostCardImpl(); // 实例化代理对象
JdkProxy proxy = new JdkProxy(cardImpl); // 生成代理对象
PostCard create = proxy.create(); // 调用代理对象方法
create.soup();
}

而cglib对象则是对没有实现接口类的增强,JDK代理无法做到这一点。cglib代理就是生成目标类的子类来增强。如下为案例,复用以上的类无须实现接口。然后创建cglib代理类,代码如下:

//代理类
public class CglibProxy implements MethodInterceptor{ /*
* 调用构造函数的时,将类对象创建出来
* */
private PostCard postCard; //增强的目标 public CglibProxy(PostCard postCard){
this.postCard=postCard;
} // 利用cglib生成代理对象 public PostCard create(){
// 创建cglib的核心对象
Enhancer enhancer = new Enhancer(); // 设置父类
enhancer.setSuperclass(postCard.getClass()); // 设置回调
enhancer.setCallback(this); // 创建代理对象
PostCard proxy = (PostCard) enhancer.create(); return proxy;
} /*
* 调用目标方法时,实质上就是调用该方法
* 参数1:代理对象
* 参数2:目标方法
* 参数3:目标方法的形参
* 参数4:代理方法
* */
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable { // 添加检测权限的方法
System.out.println("检测权限cglib..."); // 调用目标父类方法
Object object = arg3.invokeSuper(arg0, arg2); return object;
}
}

测试代码如下:

    @Test
public void test1() {
// 目标
PostCard impl = new PostCardImpl(); // 实例化代理对象
CglibProxy cglibProxy = new CglibProxy(impl); // 生成代理对象
PostCard create = cglibProxy.create(); // 调用代理对象的方法
create.soup();
}

以上就是这2种代理的区别,SpringAOP编程就是利用的代理方法实现切面编程。

Spring核心技术AOP实现原理的更多相关文章

  1. 深入浅析Spring的AOP实现原理

    转载来源:https://www.jb51.net/article/81788.htm AOP(Aspect-OrientedProgramming,面向切面编程),可以说是OOP(Object-Or ...

  2. Spring IOC AOP的原理 如果让你自己设计IOC,AOP如何处理(百度)

    百度的面试官问,如果让你自己设计一个IOC,和AOP,如何设计, 我把IOC的过程答出来了,但是明显不对, (1) IOC 利用了反射,自己有个id,classtype,hashmap,所有的功能都在 ...

  3. 【Spring】AOP实现原理(一):AOP基础知识

    AOP相关概念 在学习AOP实现原理之前,先了解下AOP相关基础知识. AOP面向切面编程,它可以通过预编译方式或者基于动态代理对我们编写的代码进行拦截(也叫增强处理),在方法执行前后可以做一些操作, ...

  4. 新秀学习SSH(十四)——Spring集装箱AOP其原理——动态代理

    之前写了一篇文章IOC该博客--<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大特性是IOC和AOP. IOC负责将对象动态的注入到容器,从而达到 ...

  5. 理解Spring:AOP的原理及手动实现

    引入 到目前为止,我们已经完成了简易的IOC和DI的功能,虽然相比如Spring来说肯定是非常简陋的,但是毕竟我们是为了理解原理的,也没必要一定要做一个和Spring一样的东西.到了现在并不能让我们松 ...

  6. 【Spring】AOP实现原理(三):创建代理

    AbstractAutoProxyCreator 在AbstractAutoProxyCreator的wrapIfNecessary方法中,调用getAdvicesAndAdvisorsForBean ...

  7. 【Spring】AOP实现原理(二):Advisor获取

    @EnableAspectJAutoProxy @EnableAspectJAutoProxy注解可以用来开启AOP,那么就从@EnableAspectJAutoProxy入手学习一下Spring A ...

  8. Spring之AOP实现原理

  9. Spring核心技术AOP案例

    在SpringAOP开发之前,首先要了解一下这几个概念.Target:目标,通俗的说对哪个类做增强,那个类就是目标.JoinPoint:连接点,在实际开发中可以被增强的点.PointCut:切入点,在 ...

随机推荐

  1. python中WSGI是什么

    uswgi学习文档 http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html WSGI是什么? WSGI,全称 Web ...

  2. [LintCode] 尾部的零

    class Solution { public: // param n : description of n // return: description of return long long tr ...

  3. text-align:justify 使用参考

    对 text-align:justify 不大了解的,可以先看这里:从css text-align:justify 谈谈 text-align 文本对齐方式,讲的比较浅显易懂,本篇相对深入些,最好先看 ...

  4. POJ 3150 Cellular Automaton(矩阵快速幂)

    Cellular Automaton Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 3504 Accepted: 1421 C ...

  5. Fluent Ribbon 第八步 其他控件

    前七节将Ribbon的功能大致介绍了一番,本节来介绍一些特殊控件的使用 DropDownButton控件 当前控件是显示下拉功能的基本组件,其配合Gallery能实现诸多特殊功能,代码如下所示 < ...

  6. php and mysql pear的安装

    http://www.cnblogs.com/bugY/archive/2012/07/06/2578972.html 什么是PEAR 来自百度百科:PEAR是PHP扩展与应用库(the PHP Ex ...

  7. 【转】Spring中@Component的作用

    今天在写程序的时候看见一个以前没有见过的注解(@Component),在网上查找过后,经过实践,决定把它记录下来. 1.@controller 控制器(注入服务) 用于标注控制层,相当于struts中 ...

  8. XML 解析之 jaxp 解析器

    XML 的解析方式有两种方式: DOM 解析和 SAX 解析. DOM 解析: 根据 XML 的层级结构, 在内存中分配一个树形结构, 把 XML 的标签, 属性和文本都封装成对象. 优点: 可以实现 ...

  9. Docker Libnetwork driver API

    以下内容均在libnetwork/driverapi目录下 Driver接口如下所示: // Driver is an interface that every plugin driver needs ...

  10. Vue(4)- 获取原生的DOM的方式、DIY脚手架、vue-cli的使用

    一.获取原生的DOM的方式 在js中,我们可以通过id.class或者标签获取DOM元素,vue中也为我们提供了获取原生DOM的方法,就是给标签或者组件添加ref属性,通过this.$refs获取,如 ...