AOP简介
AOP是一种编程思想,就如同面向对象这种编程思想一样,是一种编程范式,用来指导开发者如何组织程序更好的运行
AOP(面向切面编程)
作用:在不改变原代码的前提下,为其增加功能。
连接点:在程序执行任何位置,粒度为执行方法,跑出异常,设置方法等
在Aop中,理解为方法的执行
切入点::匹配连接点的式子
在SpringAop中,一个切入点可以描述一个具体方法,也可以匹配多个方法
一个具体方法:com.tsj.dao包内bookDao接口中无形惨无返回值的save方法
多个方法:所有以Dao结尾的接口中的任意方法,所有带参数的方法等
通知:在切入点处执行的操作,也就是共性操作
在SpringAop中,功能最终以方法的形式呈现
通知类:定义通知的类
切面:描述通知与切入点的对应关系
AOP入门案例
导入坐标
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
制作连接点方法(这两部与普通的Spring开发相同)
Dao接口
public interface BookDao {
public void save();
public void update();
public void delete();
public void select();
}
dao实现类,别忘了声明这是一个bean
@Repository
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("saving");
}
public void update(){
System.out.println("book dao update ...");
}
public void delete(){
System.out.println("book dao delete ...");
}
public void select(){
System.out.println("book dao select ...");
}
}
制作共性方法
声明这是一个bean,以及这是一个Aop
@Component
//声明当作Aop处理
@Aspect
public class MyAdvice {
//定义一个切入点
@Pointcut("execution(void com.tsj.dao.BookDao.update())")
private void pt(){}
//绑定切入点与通知
@Before("pt()")
public void method(){
System.out.println(System.currentTimeMillis());
}
}
在配置文件中添加注解声明开发Aop
@Configuration
@ComponentScan("com.tsj")
//此注解用来声明需要开发一个Aop
@EnableAspectJAutoProxy
public class SpringConfig {
}
Aop工作流程
1、Spring容器启动
2、读取所有切面配置的切入点(也就是切入点与通知关联,才会被读取)
--!这里只有pt会被读取 --
3、初始化bean,判断bean对应的类中是否匹配到任意的切入点
匹配失败,创建对象
匹配成功,创建目标对象的代理对象
4、获取bean执行方法
获取bean,调用方法并执行
获取bean是代理对象时,根据代理对象的运行模式运行原始方法和增强的内容,完成操作。
Aop切入点表达式
切入点:想要增强的方法
切入点表达式:要进行增强的方法的描述方式
描述方法一:按接口描述
描述方法二:按实现类描述
Aop通配符
开发技巧
Aop通知类型
Aop通知共分为5种位置
前置通知
后置通知
环绕通知(重点)
通过ProceedingJoinPoint实现对原方法的调用,因为要确定原方法执行的位置
如果没有对原方法调用,将跳过对原方法的执行
对原方法如果是Void类型,那么通知方法设置成void即可,否则必须设置为Object
由于无法预知原方法是否会抛出异常,所以环绕通知方法必须抛出异常
如果原方法不是void有返回值,那么我们的通知也需要给原方法补充return方法
返回后通知(了解)
抛出异常后通知(了解)
Aop通知从原方法中获取数据
获取切入点方法的参数
JoinPoint:适用于前置,后置,返回后,抛出异常后通知
ProceedJoinPoint:适用于环绕通知
获取切入点方法返回值
返回后通知
环绕通知
获取切入点方法运行异常信息
抛出异常后通知
环绕通知
我们通过获取方法中的参数,随后对其进行数据校验,比如说default等
了解即可(以下)