AOP的原理,也是非常简单的,即通过分离关注点让解决特定领域问题的代码从业务逻辑中独立出来,业务逻辑的代码中就不再含有针对特定领域问题代码的调用,业务逻辑同特定领域问题的关系则通过切面来封装、维护,这样原本分散在整个应用程序中的代码就可以很好的进行管理了。
在编译期修改源代码、运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,这是AOP的具体实现方法,而他是由三个重要步骤来完成的,先是生成代理对象,然后是拦截器的作用,最后是编织的具体实现。AOP框架的丰富,其实很大程度上体现在这三个步骤上所具有的丰富技术选择,以及与IOC容器之间的无缝缝合。而如果以实现方法来分的话,则主要有两类:静态AOP(包括静态织入)和动态AOP(包含动态代理、动态字节码生成、自定义类加载器、字节码转换器)。
AOP联盟定义的AOP体系结构把与AOP相关的概念大致分为由高到低、从使用到实现的三个层次。从上往下:
AOP在 权限(Authentication)、缓存(Cache)、内容传递(Context passing)、错误处理(Error handling)、懒加载(Lazy loading)、调试(Debug)、日志(Log)、跟踪优化和校准(tracing、profiling and monitoring)、性能优化(Performance optimization)、持久化(Persistence)、资源池(Resource pooling)、同步(Synchronization)、事务(Transactions)等方面都有用处,可以说是可使用范围及广。下面我们就以一张思维导图来串联,以此来铺开与AOP相关的所有的知识点。
AOP通常包含以下相关术语:
AOP增强类型(也叫 通知类型)包括:
AOP模块是Spring的核心模块,尽管Spring中有自己的一套AOP实现,但在Java社区中是最完整AOP框架还是Aspectj,所以为了弥补自己的不足,也为了提供更加丰富的AOP解决方案,Spring对Aspectj做了集成。同时,再配合Spring的IOC容器,Spring推出了一个完善的AOP解决方法。
Spring AOP的核心技术是JDK的动态代理技术。Spring AOP是以动态代理技术为基础,设计出了一系列AOP的横切实现,比如:前置增强、返回增强、异常增强等等。同时,Spring AOP还提供了一系列的Pointcut来匹配切入点,可以使用现有的切入点来设计横切面,也可以扩展相关的Pointcut方法来切入需求。
在Spring AOP 中,我们一般是通过配置文件或者编程的方式来实现的。常见的配置方法有四种:1,配置 ProxyFactoryBean 显示设置 advisors、advice、target 等。2,配置 AutoProxyCreator 这种方式下,还是如以前一样定义 bean,但是从容器中获得的其实是代理对象。3,配置<aop:config>。4,配置 <aop:aspectj-autoproxy>,使用 AspectJ 的注解来表示之前以及切入点。而编程方式是直接通过 ProxyFactory 设置 target 对象,再通过 getProxy 方法来获取代理对象。
总的来说,在Spring AOP中,对于AOP的使用者来说,可能简单配置 Bean 即可,但仔细分析 Spring AOP 的内部设计就可以看到,为了让AOP起作用,需要参照前面的 AOP 实现原理来完成一系列过程,需要为目标对象建立代理对象,这个代理对象可以通过使用JDK的Proxy来完成,也可以通过第三方的类生成器CGLIB来完成。然后,还需要启动代理对象的拦截器来完成各种横切面的织入,这一系列的织入设计时通过一系列 Adapter 来实现的。通过一系列 Adapter 的设计,就可以把AOP的横切面设计和Proxy模式有机地结合起来,从而实现在 AOP 中定义各种织入方式(这里的源码部分可能不会涉及)。具体实现过程笔者会在后面的文章中详细阐述。
内容来源于网络,如有侵权,请联系作者删除!