Spring: ------ AOP 切点、切面、通知、动态代理、注解开发

一、AOP的使用

1.AOP的开发步骤

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LRgBplut-1594526229990)(.\assets\1560240034576.png)]

2.获取动态代理类的对象

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rbsQcBfn-1594526229990)(.\assets\1560240173308.png)]

3.切入点表达式

<aop:config>
    <!-- 配置切入点 -->
	<aop:pointcut expression="切入点表达式" id="唯一标识"/>
</aop:config>

切入点表达式的语法:

  1. execution() 函数 – 方法级别的切入点

    expression="execution(方法返回值类型  包名.子包名.类名.方法名(参数列表类型))"
    
    		支持通配符:* 代表所有        ..常用在参数列表上代表所有参数类型
    
    示例:
           "execution(entity.User com.baizhi.UserServiceImpl.register(int))"
           "execution(* com.baizhi.UserServiceImpl.register(int,String))"
           "execution(* com.baizhi.UserServiceImpl.register(int,String,..))"
                返回值类型:任意
                包:		com.baizhi
                类:		UserServiceImpl
                方法:		register
                参数:		至少有2个参数,且第1个必须是int类型,第2个必须是String类型。
           "execution(* com.baizhi.UserServiceImpl.register(..))"
           "execution(* com.baizhi.UserServiceImpl.query*(..))"
           "execution(* com.baizhi.*ServiceImpl.query*(..))"
           "execution(* com.bai*.*ServiceImpl.query*(..))"
           "execution(* com.baizhi.User*.query*(..))"
           "execution(* com.baizhi.User.*User(..))"
           "execution(* com.baizhi..*ServiceImpl.query*(..))"
                返回值类型:任意
                包:		com.baizhi根包及其所有子包
                类:		以ServiceImpl结尾的类
                方法:		以query开头
                参数:     任意
                
       注意: 切入表达式 尽量 进行精准切入!   execute(* com.baizhi.service.impl.*ServiceImpl.query*(..))
           execution(* *.*(..)) 避免
    
  2. within()函数 – 类级别的切入点(性能高)

    当1个类(几个类)中所有方法 增加 完全相同的 通知时,可以使用 类级别的切入点表达式。
    语法:  expression="within(包名.子包名.类名)"
    

4.切面

切面 = 切入点 + 通知。

<aop:config>
    <!-- 配置切入点 -->
    <aop:pointcut expression="切入点表达式" id="唯一标识"/>
    <!-- 配置组装切面 -->
    <aop:advisor advice-ref="要引用的通知beanId" pointcut-ref="要引用的切入点beanId" />
</aop:config>

5.通知

通知,是额外功能。

分为4种(根据通知要添加到的位置不同进行划分):

1. 前置通知        额外功能被添加到 主要功能的前面                   MethodBeforeAdvice
	2. 后置通知                                                         后面                  AfterReturningAdvice
	3. 环绕通知                                                      的前和后面           MethodInterceptor
	4. 异常通知                                                     执行出现异常时     ThrowsAdvice

5.1 前置通知

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-47SKCeGX-1594526229991)(.\assets\1560243129140.png)]

5.2后置通知

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kr6oeXz3-1594526229992)(.\assets\1560244969463.png)]

5.3环绕通知

在这里插入图片描述

5.4异常通知

在这里插入图片描述

三、AOP的概念

AOP(Aspect Oriented Programming) 面向切面编程

OOP(Object Oriented Programming) 面向对象编程

AOP:从切面(切入点+通知)入手,基于spring的动态代理 给目标类 增加 额外 功能。

​ 切面:

​ 额外功能:

​ 通知:

​ 切入点:

​ 目标类:

​ 目标方法:

AOP的使用场景:给目标类 增加 额外功能时 使用。

AOP的好处:解耦合。

AOP动态代理有两种实现方式 :

  1. Proxy JDK的反射包,aop默认采用

动态代理类 实现(目标类实现的)接口。

  1. CGLIB 开源(对JDK的proxy进行了封装)

    动态代理类 扩展目标类。

JDK的底层实现:
在这里插在这里插入图片描述入图片描述

修改动态代理为CGLIB:

在这里插入图片描述

四、S2SM基于注解式开发

​ spring2.X引入了注释式开发。

​ 作用:1) 简化spring.xml的配置

​ 2) 降低了java代码的可读性

1.IOC相关

  • 注解包扫描:

在这里插入图片描述

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jvmHVnNU-1594549176071)(.\assets\1560494368182.png)]

2.DI相关

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GPnh7yJ3-1594549176072)(.\assets\1560482674747.png)]

3.事务相关

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NLea82v5-1594549176073)(.\assets\1560483624540.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值