在软件开发的过程中,通常我们会遇到非常复杂的功能,比如:用户权限,日志记录,性能统计,安全控制,事务处理,异常处理。比如在打印日志这个功能中,如果要实现这个功能,一般来说需要在各种逻辑代码中插入添加日志打印的java 语句或者sql语句。这样会产生大量与核心业务无关的代码,这就带来了较强的侵入性编码。较为理想的编码方式,日志和业务代码应该是分离的。
这个时候SPRING 框架就设计了AOP,来防止侵入式代码的产生.但AOP并不是Spring所特有的,他的全称是Aspect-Oriented-Programming(面向切面编程)。面向切面编程这种专业词汇听不懂没关系。比如日志,我们直接在代码里写了日志表的插入语句,这个日志称之为横切关注点,
横切关注点指的是一些具有横越多个模块的行为,使用传统的软件开发方法不能够达到有效的模块化的一类特殊关注点。横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。
日志的这个类集中在代码的一个地方就叫切面。侵入式编程中也有横切关注点概念,横切关注点表示散落在程序各个地方的功能;但,切面只有在AOP中才有,那是横切关注点不再侵入式的散落在程序各个地方而是集中起来被模块化。
Spring AOP 使用场景:
Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging 调试
logging tracing profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能持久化
Persistence 持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务
下面是Spring-AOP 术语
在上文我们将横切关注点集中起来管理,它不再散落在程序的各个地方,而是被模块化,称之为切面。那么定义横切关注点在何时工作(这并不完全准确,不仅是何时工作,也包括具体的工作是什么),在某个的调用前还是调用后还是抛出异常时?定义在何时工作以及工作内容称之为通知,Spring中的切面一共提供5种通知的类型:
前置通知(Before)
后置通知(After)
返回通知(After-Running)
异常通知(After-throwing)
环绕通知(Around)
前面4个较为容易理解,例如“前置通知”,我们通常在一个方法的第一句打印出传入的方法参数,此时就可以使用前置通知在方法调用前打印出传入的参数。对于“后置通知”实际是“返回通知”和“异常通知”的并集,返回通知表示程序正确运行返回后执行,异常通知表示程序不正常运行抛出异常时执行,而后置通知则不论程序是否正确运行,一旦离开方法就会执行。
环绕通知最为强大,它包裹了被通知的方法,可同时定义前置通知和后置通知。
通知定义了何时工作以及工作内容,切点则定义了在何处工作,也就是在哪个方法应用通知。要表达出在哪个方法中运用通知,这需要用到切点表达式。Spring AOP借助AspectJ(另一种AOP实现)的切点表达式来确定通知被应用的位置,虽然是借助但并不支持所有AspectJ的所有切点指示器而仅仅是其一个子集,这其中最为常用的就是execution切点指示器,表示执行。例如:
execution(* com.deo.springaop.Test.test(..))
上面介绍了AOP中最为基本的两个术语,通知和切点。简单总结下,横切关注点集中在了一个地方被模块化称之为切面,通知和切点构成了切面的所有内容——它是什么,在何时和何处完成其功能
例如我上一篇文章中的描述:JAVA基础-Annotation_阿涩的博客-CSDN博客