本文主要是介绍【Spring源码--AOP的实现】--综述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言:
相比于IOC的源码,AOP的源码更为抽象一点。因为我们在读IOC源码,可以根据我们的Bean配置,去相结合着思考和理解,而AOP的是一个切面的概念,所生成的代理对象也不是我们说看到就看到的,相对抽象一点,但是AOP的源码相对于IOC的源码少了很多。所以我们在读AOP源码的时候,应该先把整个流程快速的读通,再去一点点具体到方法,再者就是自己动手写demo。那么,本文作为AOP的综述,主要写一些基本概念及AOP的整体设计流程。
AOP的基本概念:
- Advice:通知,定义在指定连接点上做什么内容。是AOP联盟定义的一个接口,SpringAOP在实现中提供了更多的具体通知类型,如BeforeAdvice、AfterAdvice、ThrowsAdvice等。
- Pointcut:切点,符合切点表达式的连接点,也就是被真正切入的地方。
- Aspect:切面,切入系统的一个切面,比如事物管理是一个切面,权限管理是一个切面。
- Join point:连接点,进行横向切入的位置。
AOP的理解:
Spring AOP是基于JDK动态代理和CGLIB(动态字节码增强技术)实现的,在方法执行的前后进行拦截。
对于AOP的理解,可以引用网友的一段话:
aop切面编程就是在常规的执行java类中方法前或执行后加入自定义的方法。比如你本来每天都去打酱油,去,打酱油,回。现在我每天在你打酱油路上等着,你去打酱油的时候我打你一顿,回来的时候给你点糖果吃。你根本不知道为什么我会在路上拦住打你。所以在切面中插入你自定义的方法,这个方法的执行和本身要执行的类方法无关系,也就是不是这个类的方法来调用你写的方法的,你写的方法什么时候执行都是要通过在配置指定。我打完你,你该打酱油还是去打酱油,当然我如果是拦住你让你酱油打少点,你打酱油的时候还是会打那么多,但是在你打完酱油回来的时候我可以把你的酱油倒些出去,所以嵌入的自定义方法对要调用的类方法本身没有影响,但是可以操纵这个方法的返结果或者处理结果。
AOP的设计分析:
虽然对于我们使用者来说,只需要进行简单的配置即可使用SpringAOP,但仔细分析其内部实现可以看到,这里面还是有挺复杂的一个过程。如图所示:
上面这个图大概解释了aop的一个实现过程,具体的细节还是有很多的,这里只是给大家理解一个整体流程。具体我们后面会分析代码,也就是按照这个顺序。
AOP的配置方式:
一般可以有以下几种方式,其中<aop:config>用的最多,AspectJ的注解用的也还好,ProxyFactoryBean就相对麻烦点,不过是最基本的,最好理解AOP原理的,根据项目不同进行选择。
- 配置ProxyFactoryBean,显式地设置advisors, advice, target等
- 通过<aop:config>来配置
- 通过<aop:aspectj-autoproxy>来配置,使用AspectJ的注解来标识通知及切入点
AOP的应用场景:
应用场景体现在两个方面:一是应用可以直接使用AOP的功能,设计应用的横切关注点,把扩约应用程序多个模块的功能抽象出来,并通过简单的AOP的使用,灵活的编制到模块中,比如:日志记录的功能。另一方面,在Spring内部,一些支持模块也是利用Spring AOP来实现的,如:事务处理。根据网上的网友总结,大概可以用用到一下几个方面:
- Authentication 权限
- Caching 缓存
- Context passing 内容传递
- Error handling 错误处理
- Lazy loading 懒加载
- Debugging 调试
- logging, tracing, profiling and monitoring 记录跟踪 优化 校准
- Performance optimization 性能优化
- Persistence 持久化
- Resource pooling 资源池
- Synchronization 同步
- Transactions 事务
关于SpringAOP综述,大概就介绍这些内容,后续我会跟着上面的流程图,先以ProxyFactoryBean的配置为例,进行源码的走读。后面再去了解下<aop:config>这样的配置是如何实现的AOP。题外话:最近手头有项目了,可能博客内容更新会稍微慢点!
这篇关于【Spring源码--AOP的实现】--综述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!