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:切入点,在 ...
随机推荐
- Servlet初始化及处理HTTP请求
上一篇详细介绍了与Servlet相关的几个核心的接口和类,当我们自己写Servlet类时,一般需要继承HttpServlet类,实现init().doGet().doPost()等方法.当我们写好Se ...
- poj1699(状态压缩dp)
可能没有完全读懂题意. 个人觉得 acca aa 答案应该是4. 然后就是dp了..这题数据量小很多方法都可以,数据也水暴力据说都能过.. 还有就是我竟然没有用扩展kmp优化下... 太无耻了,我是因 ...
- mac下面安装多个JDK
JDK8 GA之后,小伙伴们喜大普奔,纷纷跃跃欲试,想体验一下Java8的Lambda等新特性,可是目前Java企业级应用的主打版本还是JDK6, JDK7.因此,我需要在我的电脑上同时有JDK8,J ...
- vmware key
VMware vRealize Suite 2017 Enterprise N04CL-09H9H-J89DJ-0KCH6-90N0J VMware vRealize Operations Man ...
- [LintCode] 最后一个单词的长度
class Solution { public: /** * @param s A string * @return the length of last word */ int lengthOfLa ...
- python之MySQL学习——数据操作
1.增 import pymysql as ps # 打开数据库连接 db = ps.connect(host=', database='test', charset='utf8') # 创建一个游标 ...
- Oracle数据库命令行下数据的导入导出
//设置导入导出字符集,导入导出都要设置一下 export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK //导出 exp system/oracle@orcl file=/u ...
- BaseDao 接口
// 以后所有的 Dao 接口都需要继承 BaseDao 接口; // 自定义泛型接口 public interface BaseDao<T>{ public void save(T t) ...
- XML 之快速入门
XML 简介 - XML, 即可扩展标记语言(eXtensible Markup Language), 是一种标记语言. - 标记型语言: 使用标签进行操作 - 可扩展: XML 的标签可以自定义 - ...
- PBR工作流
目标是让substance效果和unity效果一致 分2步: 1.完成1个shader,效果和standard完全一致,抛去不需要的功能 2.使用新的shader,在substance里替代原有的渲染 ...