面向切面AOP
1-介绍
AOP思想,不通过修改源代码的方式,在主干方法中添加新的功能,可以增强某个方法;
- 类里的某个方法可以被增强时,称能够被增强的方法为连接点
- 真正被增强的方法,称为切入点
- 增强的逻辑部分称为通知
- 5种类型的通知:前置通知、后置通知、环绕通知、异常通知、最终通知
- 把通知应用到切入点的过程,称为切面
2-底层原理
情况1:有接口的情况
这类情况很好处理,直接使用JDK动态代理的方法,创建代理对象实现增强方法,实质使用到了Java的动态代理特性,详细介绍参照我的另一篇博客,https://blog.csdn.net/Wang_Pro/article/details/114481171的动态代理。
情况2:没有提供接口
使用CGLIB动态代理
3-基于AspectJ实现AOP操作
- 基于注解方式进行实现
- 切入点表达式:execution([权限修饰符] [返回类型] [类全路径] 方法名称 )
- 增强类上使用@Aspect进行增强类声明
- 在增强类中配置不同类型的通知
- @before(value = “execution(…)”)
- @AfterReturning(value = “execution(…)”)
- @After(value = “execution(…)”)
- @AfterThrowing(value = “execution(…)”)
- @Around(value = “execution(…)”)
- xml文件开启扫描,或者写一个注解类
问题:如果一个基本类有多个类对它进行增强,怎么办?
- 在增强类上面添加注解 @Order(数字类型值),数字类型值越小优先级越高
问题:如果想对切入点表达式进行抽取
那就写一个专门抽取它的类
@Pointcut(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void pointdemo() {
}
// 之后使用,完成表达式抽取
@Before(value = "pointdemo()")
public void before() {
System. out .println( "before.........");
}
- 使用xml配置进行增强实现
<!--创建对象-->
< bean id= "book" class= "com.atguigu.spring5.aopxml.Book"></ bean>
< bean id= "bookProxy" class= "com.atguigu.spring5.aopxml.BookProxy"></ bean>
3 、在 spring 配置文件中配置切入点
<!--配置 aop 增强-->
<aop:config>
<!--切入点-->
< aop:pointcut id= "p" expression= "execution(*
com.atguigu.spring5.aopxml.Book.buy(..))"/>
<!--配置切面-->
<aop:aspect ref= "bookProxy">
<!--增强作用在具体的方法上-->
<aop:before method= "before" pointcut-ref= "p"/>
</aop:aspect>
</aop:config>