1 概念
在不修改原有业务的情况下,对业务做一些增强处理
1.1连接点
自己实现的业务逻辑。例如:在dao里面的 update,delete,select
1.2切入点
在哪些方法里面做增强。例如:在update 里面做增强,update就是切入点
1.3通知:定义通知
通知类:定义一个类为切面类
通知方法:需要在那个方法里面做增强
1.4 切面
将需要增强的功能方法 和 切入点绑定到一起 就是切面
在练习里面会加深理解
练习
1.1引入依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
1.2 定义接口和实现类
需求描述:在每个实现方法执行前打印当前的系统时间
连接点和切入点的理解: 在接口里面定义的方法是连接点,需要在哪些方法里面增强功能是切入点
public interface ILoginService {
String login();
void update();
boolean delete();
}
//定义实现类
@Slf4j
@Service
public class LoginServiceImpl implements ILoginService {
@Autowired
@Qualifier("ILoginDao2")
public ILoginDao iLoginDao;
@Value("${name}")
public String name;
@Override
public String login() {
log.info("{}","login validator send service :" + name);
iLoginDao.login();
return "login success !!!";
}
@Override
public void update() {
System.out.println(System.currentTimeMillis());
log.info("{}","update service");
}
@Override
public boolean delete() {
log.info("{}","delete service");
return false;
}
}
1.3 定义通知类,执行通知的方法(在指定的每个方法中执行的共性逻辑)
@Component 将通知类交由spirng来管理
@Aspect 将此类定义为切面类
通知方法: 这个类是里面的方法是通知方法(就是在哪些切入点需要执行的方法)
@Component
@Aspect
public class MyAOP {
public void method(){}
}
1.4 定义切入点
在哪些方法中执行共性业务和增强逻辑用@Before 做绑定
将需要增强的功能方法下面是 【 aop() 方法】 和 【 通知方法 method() 方法 】 上面定义的【 切入点 update() 方法 】绑定到一起 就是切面
@Component
@Aspect
public class MyAOP {
@Pointcut("execution(void com.drawing.springsecuritydemo.service.ILoginService.update())")
private void method(){}
@Before("method()")
public void aop(){
System.out.println(System.currentTimeMillis());
}
}
1.5 开启 spring对aop的支持
aop 工作流程
aop切入点表达式
1.1切入点表达式标准格式:动作关键字 (访问修饰符 返回值类型 包名.类/接口.方法名(参数) 异常类型)
@Pointcut("execution(void com.drawing.springsecuritydemo.service.ILoginService.update())")
简化配置
可以使用通配符描述切入点,快速描述
*:单个独立的任意符号,可以独立出现,也可以作为前戳或者后戳的匹配符出现
@Pointcut("execution(* com.drawing.springsecuritydemo.service.ILoginService.*())")
..:多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写
@Pointcut("execution(* com.drawing.springsecuritydemo..*())")
aop 通知类型
之前通知 :@Before("method()")
之后通知 : @After("method()")
环绕通知(重点):@Around("method()")
返回后通知(了解) : @AfterReturning("method()")
异常后通知(了解): @AfterThrowing("method()")
例子1:前后添加通知
执行
前后通知打印的效果