日志、事务、安全验证等这些 “通用的”、散布在系统各处的需要再实现业务逻辑时关注的事情称为 “方面”,也可称为 “关注点”。如果能将这些 “方面” 集中处理,然后在具体运行时,再由容器动态织入这些“方面”,至少有以下好处:
- 可减少 “方面” 代码里的错误,处理策略改变时还能做到统一修改。
- 在编写业务逻辑时可以专心于核心业务。
因此,AOP要做的事情就是从系统中分离出 “方面”,然后集中实现。从而可以独立地编写业务代码和方面代码,在系统运行时,再将方面 “织入” 到系统中。
AOP的几个重要概念
切面
方面的实现,如日志切面、事务切面、权限切面等。在实际应用中通常是存放方面实现的普通Java类,要被AOP容器识别为切面,需要在配置中通过<bean>标记指定。
通知
是切面的具体实现,能实现特定的功能。以目标方法为参照点。根据放置的位置不同,可以分为前置通知、后置通知、异常通知、环绕通知和最终通知5种。切面类中的某个方法属于哪类通知,需要在配置中指定。
切入点
用于定义通知应该织入到哪些连接点上。
目标对象
指将要织入切面的对象。这些对象中只包含核心业务逻辑代码,所有日志、事务、安全验证等方面的功能等待AOP容器的织入。
代理对象
将通知应用到目标对象之后,被动态创建的对象。代理对象的功能相当于目标对象中实现的核心业务逻辑功能加上方面代码实现的功能。
织入
将切面应用到目标对象,从而创建一个新的代理对象的过程。