AOP面向切面编程
增强,日志收集,权限收集
现在举一个例子,假设有一个这样的流程,在学生系统中,选课功能模块中
1.记录日志(a.学号信息密码,b.调用了什么方法,c.当前时间)–>2.查询某个学生信息–>3.查询可以选的课列表–>4.记录日志(a.准备返回的数据,b.什么时候返回的)
第二个和第三个肯定是某个具体的方法,在日志中,这个时间很关键,从时间我们可以看出来,如果时间长,说明数据量大,性能差,这就说明需要优化
aop术语
先举一个例子
现在我们有诗人和骑士俩个对象,骑士要远征,而诗人对于骑士即将要远征需要去城门口歌颂他们,对于这个来说,我们所需要关注的是主要行为,是骑士类行为,而诗人对象(切面)会自动为我们进行服务,无需过多关注
- 切面
这个通俗的说,就是被增强类,比如我们想要对某个类中的某个方法,需要增强,比如增加日志等功能,在这切面中定义切点,通知类型方法(日志功能)
- 切点
实际被真正增强的方法,这个被称为切入点,切点表达式,知道对哪个类里面的哪个方法进行增强
- 连接点
切点中的一个具体的方法,类里面有哪些方法可以被增强,这些方法被称为连接点
- 通知
增强的代码
总结的说就是,什么地方(切面),对什么方法(连接点),在什么时候增强(通知类型),定位什么地方,什么方法(切点)
再举一个例子
定义俩个类,一个被增强类,这个是骑士类,骑士类主要做的行为是保卫国家
/**
* @ClassName qishi
* @Description 这个是被增强类
* @Author LY
* @Date 2023/9/14 1:45
*/
@Component
public class qishi {
// @Pointcut("execution(* aop.qishi.*(..))")
public void yuancheng(){
System.out.println("我们要保卫国家,加油~");
};
}
一个增强类,这个是诗人类,这个是对骑士类做的一个增强,比如说在骑士保卫国家之前,对骑士做一个祈福,在骑士保卫国家之后,对骑士的一个歌颂
这个是属于切面,在切面中要定义切点,这个切点中的表达式要定位到我们想要增强的某个类中的某个方法,以及我们想要增强的一些通知类型的方法,比如前置通知,后置通知,环绕通知等等
/**
* @ClassName shiren
* @Description 增强类
* @Author LY
* @Date 2023/9/14 1:45
*/
@Aspect //告诉spring这个是切面
@Component
public class shiren {
/**
* 对于诗人来说,他们主要要做的是在骑士出门前歌颂,以及在他们回来之后为他们祈福
*/
@Before("execution(* aop.qishi.*(..))")
// @Pointcut("execution(* aop.qishi.*(..))")
public void gesong(){
System.out.println("阿门,希望老天保佑你们~");
}
@After("execution(* aop.qishi.yuancheng(..))")
public void qifu(){
System.out.println("阿门,你们是最强的~");
};
}
springConfig.java
@Configuration
@ComponentScan("aop")
@EnableAspectJAutoProxy(proxyTargetClass = true)//开启代理对象
public class springConfig {
}
结果
结果分析
- @Ponintcut
在切面类中,先定义一个方法并使用 @Pointcut 注解来指定表达式。
然后在定义切面通知时,在通知注解中指定定义表达式的方法签名。
在上面举个的例子属于内置配置,这种属于注解配置
@Pointcut("execution(* aop.qishi.*(..))")
private void pointCut(){
}
@Before("pointCut()")
public void gesong(){
System.out.println("阿门,希望老天保佑你们~");
}
- @Before等通知注解
就直接使用我们定义好的切点方法签名即可