Spring核心技术AOP实现原理
关于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实现原理的更多相关文章
- 深入浅析Spring的AOP实现原理
转载来源:https://www.jb51.net/article/81788.htm AOP(Aspect-OrientedProgramming,面向切面编程),可以说是OOP(Object-Or ...
- Spring IOC AOP的原理 如果让你自己设计IOC,AOP如何处理(百度)
百度的面试官问,如果让你自己设计一个IOC,和AOP,如何设计, 我把IOC的过程答出来了,但是明显不对, (1) IOC 利用了反射,自己有个id,classtype,hashmap,所有的功能都在 ...
- 【Spring】AOP实现原理(一):AOP基础知识
AOP相关概念 在学习AOP实现原理之前,先了解下AOP相关基础知识. AOP面向切面编程,它可以通过预编译方式或者基于动态代理对我们编写的代码进行拦截(也叫增强处理),在方法执行前后可以做一些操作, ...
- 新秀学习SSH(十四)——Spring集装箱AOP其原理——动态代理
之前写了一篇文章IOC该博客--<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大特性是IOC和AOP. IOC负责将对象动态的注入到容器,从而达到 ...
- 理解Spring:AOP的原理及手动实现
引入 到目前为止,我们已经完成了简易的IOC和DI的功能,虽然相比如Spring来说肯定是非常简陋的,但是毕竟我们是为了理解原理的,也没必要一定要做一个和Spring一样的东西.到了现在并不能让我们松 ...
- 【Spring】AOP实现原理(三):创建代理
AbstractAutoProxyCreator 在AbstractAutoProxyCreator的wrapIfNecessary方法中,调用getAdvicesAndAdvisorsForBean ...
- 【Spring】AOP实现原理(二):Advisor获取
@EnableAspectJAutoProxy @EnableAspectJAutoProxy注解可以用来开启AOP,那么就从@EnableAspectJAutoProxy入手学习一下Spring A ...
- Spring之AOP实现原理
- Spring核心技术AOP案例
在SpringAOP开发之前,首先要了解一下这几个概念.Target:目标,通俗的说对哪个类做增强,那个类就是目标.JoinPoint:连接点,在实际开发中可以被增强的点.PointCut:切入点,在 ...
随机推荐
- Duilib教程-自动布局2
在上一节中,我简单介绍了控件随父LAYOUT自由移动的设置.在这一节,我将介绍一种常见的情况:嵌入窗口. 在项目中,我们很少会100%的编写一个软件,特别是界面相关的,我们会使用以前已经编写好的窗口, ...
- 再谈iOS 7的手势滑动返回功能
本文转载至 http://blog.csdn.net/jasonblog/article/details/28282147 之前随手写过一篇<使用UIScreenEdgePanGestureR ...
- C/C++求职宝典重点笔记
这是我之前准备找工作时看<C/C++求职宝典>一书做的笔记,都是一些笔试面试中常考的重点难点问题,但比较基础,适合初学者看. 1. char c = '\72'; 中的\72代表一个字符, ...
- 显示excel工作簿中所有工作表的名称!!!
问题描述: 有一个工作簿里边将近二百多个工作表(公司),想统计里边所有公司名称即二百多个工作表的名称. 1.找一个空白工作表,也可以利用原来工作表中不用的列,转到“公式”工具栏,点击名称管理,在跳出来 ...
- CKEDITOR 3.4.2中 按钮事件中 动态改变图标和title 获取按钮
this.uiItems[0].className="cke_button_hui_position_type";this.uiItems[0].title="zhang ...
- centos7的nfs配置
author : headsen chen date : 2018-04-12 09:40:14 一,服务端安装和配置: 环境准备: systemctl stop firewalld system ...
- 怎样sublime显示文件夹
1.Project -> Add Folder to Project 2.选择你要添加的文件文件 效果图
- JAVA源码之JDK(一)——java.lang.Object
想要深入学习JAVA,还需追本溯源,从源码学起.这是我目前的想法.如今JAVA各种开源框架涌出,很多JAVA程序员都只停留在如何熟练使用的层次.身为其中一员的我深感惭愧,所以要加快学习的脚步,开始研究 ...
- mysql replace 使用注意,update的时候 删除从表数据
使用REPLACE插入一条记录时,如果不重复,REPLACE就和INSERT的功能一样,如果有重复记录,REPLACE就使用新记录的值来替换原来的记录值. 使用REPLACE的最大好处就是可以将DEL ...
- As of Flume 1.4.0, Avro is the default RPC protocol.
Flume 1.8.0 Developer Guide — Apache Flume http://flume.apache.org/FlumeDeveloperGuide.html The remo ...