该篇博客就开始Spring的AOP之旅了,本篇博客主要阐述一些AOP的理解性问题
在开发中,分布于应用中多处的功能被称为横切关注点(cross-cutting concerns).通常这些横切关注点从概念上是与应用的核心业务逻辑相分离的。将这些横切关注点与核心业务逻辑相分离,这就是面向切面编程(AOP)所要解决的问题
依赖注入有助于应用对象之间的解耦,而AOP可以实现横切关注点与它们所影响的对象之间的解耦
通过上面的阐述,大概了解了面向切面解决哪些问题,到底什么是面向切面,将在此条做出解释
如图三个切面(安全、日志、事务)影响这四个核心业务
横切关注点可以被描述为影响应用多处的功能,比如你需要在许多方法执行完毕后打一个log,我们可以在这些方法执行完毕后的语句中添加log,但是加入方法很多,会很麻烦,而且让业务逻辑相当的不清晰。所以AOP就是来完成这个不必要的麻烦。在使用面向切面编程时,我们仍然在一个地方定义通用的功能,我们可以通过声明式的方式来定义这些功能以何种方式在何处应用,而无需修改受影响的类。这些横切关注点可以被模块化为一个特殊的类,这些类被称为切面
横切关注点可以被模块化为特殊的类,这些类被称为切面
在AOP术语中,切面的工作被称为通知。通知定义了切面是什么以及何时使用(比如这个工作应该应用于某个方法之前或之后等等)
在系统运行之前,AOP的功能模块需要织入到OOP的功能模块中。所以,要进行这种织入过程我们需要知道在系统的哪些执行点上进行织入操作,这些将要在其之上进行织入操作的系统执行点就称为Joinpoint。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程中,并添加新的行为
如果通知定义了切面的“什么”和“何时”,那么切点就定义了“何处”
有些AOP框架允许我们创建动态的切点,可以根据运行时的决策(比如方法的参数值)来决定是否应用通知
引入允许我们向现有的类添加新方法或者属性,可以实现无需修改这些现有的类的情况下,让它们具有新的行为和状态
织入是将切面应用到目标对象来创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以进行织入
并不是所有AOP框架都是一样的,现在AOP框架有三个是最常见的
Spring AOP只支持ioc容器管理的Bean,其他的普通java类无法支持aop。同时Spring整合了aspectj,使得Spring体系中可以使用aspectj语法来实现aop
AspectJ是一个面向切面的框架,它扩展了Java语言,AspectJ定义了AOP语法,所以它有一个专门的编译器用来遵守Java字节编码规范的Class文件
Spring提供了四种类型的AOP支持
实际上POJO只是提供了满足切点条件时所需调用的方法,但是这种技术需要XML进行配置,而不能支持注解。所以Spring借鉴了AspectJ的切面,所以提供了@AspectJ注解驱动的切面,本质上依然是Spring基于代理的AOP,只是编程模式以及方法与AspectJ类似了,不需要XML配置
《Spring IN ACTION》 《Spring 揭秘》