AOP
概念
Spring 经典AOP实现
Spring 2.0 基于XML声明的AOP实现
------------------------
相关概念
面向方面(切面)的编程
Aspect oriented Programming
关注点(Concern)
应用要考虑的问题或者说应用要达到的目标
比如:业务逻辑,安全,DB事务边界,持久化,远程服务等
在一般OOP应用中,
安全检查,DB事务控制,日志等代码"穿插"在业务逻辑中
这种代码被称为横切关注点(Cross Cutting Concern)
方面(Aspect)
就是横切关注点,在 Spring 中由Advisor表示
织入(Weaving)
把 Aspect 加入到核心业务逻辑中
织入由框架实现,不需要编程
AOP的目标或意义
将 Aspect 与 核心业务逻辑 解耦
示例:表演前观众入座
核心接口和类:
MethodBeforeAdvice —— 接口,需实现,提供切面前置行为
JdkRegexpMethodPointcut —— 实现类,需配置,以正则表达式匹配方法
DefaultPointcutAdvisor —— 实现类,需配置
ProxyFactoryBean —— 实现类,需配置
理解:
代理模式 —— Actable,Actor,Broker
Advice —— what,要加入的行为是什么
Pointcut —— where , 在哪里加入行为(与哪个业务方法关联)
Aspect —— 即Advisor,由Advice+Pointcut组合而成
target —— 业务逻辑对象,Aspect 被织入的目标
FactoryBean —— 工厂bean,用于生成其他类型bean的bean
修改:使用RegexpMethodPointcutAdvisor
内置了Pointcut的Advisor
示例:观众鼓掌及抗议
核心接口:
AfterReturningAdvice
ThrowsAdvice
理解:
Advice(what,when) —— 要做什么, 及什么时候做(与业务方法的先后关系)
Advice 的方法的参数
修改: 使用 MethodInterceptor
三项全能的 Advice
示例:表演前剧院先开门 —— 又一个Aspect
理解:
一个目标对象可以添加多个Aspect
自动代理创建器
若有多个对象需要织入Aspect,则需要一一声明相应的代理
自动代理创建器可以使你摆脱这个麻烦
示例:为Teacher-新Expert ,织入即有的 Aspect
XML-based AOP
Spring 2.0 通过XML标记声明,可以将POJO定义为Aspect 。
新标记基于 aop 的命名空间,而非 beans .
示例:使用XML声明,使观众在演出前就座
示例:织入观众的其他行为
核心标记:参照 spring-reference
aop:config —— 包含 pointcut,aspect 等,可多次出现
aop:aspect —— 引用一个pojo,内部包含 pointcut 和 各种 advice
aop:pointcut —— 定义一个pointcut
aop:before
aop:after-returning
aop:after-throwing —— 这三个定义不同的 advice
示例:使用 around advice 替代以上三个
aop:around —— 指定的方法必须满足:
返回类型 Object
第一个参数类型必须是 ProceedingJoinPoint
throws Throwable