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:切入点,在 ...
随机推荐
- Maven使用deploy上传jar包到远程库 以Oracle驱动为例
一.首先要得到Oracle JDBC Driver 1.通过Oracle官方网站下载相应版本:http://www.oracle.com/technetwork/database/features/j ...
- $().each() 与 $.each()区别,以及 jquery ajax 应用
在jquery 中我们可以选择$().each() 与 $.each() 进行迭代对象和数组 $(items).each(function(){ //item }) , 而后者则 $.each(i ...
- JZOJ.5264【NOIP2017模拟8.12】化学
Description
- 【BZOJ4584】[Apio2016]赛艇 DP
[BZOJ4584][Apio2016]赛艇 Description 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着个划艇学校,编号依次为到.每个学校都拥有若干艘划艇.同一所学校的所 ...
- 4.Data Types in the mongo Shell-官方文档摘录
总结: 1.MongoDB 的BSON格式支持额外的数据类型 2 Date 对象内部存储64位字节存整数,存储使用NumberLong()这个类来存,使用NumberInt()存32位整数,128位十 ...
- django 单元测试小结
测试的场景 框架Django1.8 测试工具 unittest, 要记得给test设置一个独特的settings. 测试请求 也就是测试整个view部分 官方案例 其中可能会遇到登录,或者时sessi ...
- 对ASIHTTPRequest的封装
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/quanqinayng/article/details/37659751 .h文件 // // Ht ...
- python删除所有的中文字符、非ASCII或非英文字符,检查字符串是否包含非ASCII
Your ''.join() expression is filtering, removing anything non-ASCII; you could use a conditional exp ...
- Linux学习笔记之文件权限
前言: 说起文件权限,大家在windows下应该很熟悉就对文件右键属性,然后配置一点什么读写之类的权限,然后可以分配到每个的人. 对于linux 我先为大家介绍一个使用者和组和其他的概念说明一下 文件 ...
- JS连等赋值的坑
cnblogs标题: JS连等赋值的坑 关于JS连等赋值有个经典的笔试题: var a = {n: 1}; var b = a; a.x = a = {n: 2}; console.log(a.x); ...