AOP的核心概念
概念 | 描述 |
---|---|
Advice,通知 | 需要单独封装的功能,定义在类的方法中 |
Joinpoint,连接点 | 可以使用通知的地方 |
Pointcut,切入点 | 定义使用通知的连接点集合 |
Aspect,切面 | 通知和切入点的组合 |
Weaving,织入 | 把切面应用到应用程序中的过程 |
Target,目标 | 应用切面的对象 |
Introduction,引入 | 向现有的类添加新方法或新属性 |
通知
看下面伪代码:
Service-1:
public class UserService{
public void reg(){
logger.log();
doReg();
}
public void login(){
logger.log();
doLogin();
}
}
Service-2:
public class OrderService{
public void add(){
logger.log();
doAdd();
}
}
对于上面两个类,它们的方法都有一个记日志的功能。从面向切面编程的角度来说,它就是一个通知,那么这个记日志的代码就不能让其分散在每一个业务逻辑方法里。可以像下面这样实现:
public class LogAdvice{
public void log(){
...
}
}
Service-1:
public class UserService{
public void reg(){
//logger.log();
doReg();
}
public void login(){
//logger.log();
doLogin();
}
}
Service-2:
public class OrderService{
public void add(){
//logger.log();
doAdd();
}
}
连接点
在上面的例子里面,可以使用通知的地方在方法里面。SpringAOP本身只支持在一个public的非静态的方法上面来应用通知;对于AspectJ来说,应用通知的地方就更多。
切入点
上面说连接点时,是进入方法时候可以使用通知。但是,方法有很多,到底哪些方法可以来执行通知,就需要通过切入点来定义。因此,切入点在开发里面会经常使用,它可以非常明确的定义哪些包下面的哪些类的哪些方法可以应用通知。
切面
是一个组合起来的概念,它会定义通知和切入点。因为通知是定义了需要加入到业务逻辑里面的功能,而切入点定义了这些通知到底用在哪些地方。将它们组合起来,在运行时就可以非常明确的知道切面的具体执行时机。
比如上面示例代码,我想定义的切入点是所有以“Service”结尾的类里面以“add”开头的方法。这样的话,就只会在OrderService类里的add()方法中应用,其他不满足要求的就不会应用到切面里面定义的功能。
切面是在使用Spring过程中,需要着重进行配置的。
织入
比较简单,就是一个动词,把切面应用到应用程序的过程。
目标
上面的示例伪代码中,Service的实例就是目标。