一、AOP的使用
1.AOP的开发步骤
2.获取动态代理类的对象
3.切入点表达式
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut expression="切入点表达式" id="唯一标识"/>
</aop:config>
切入点表达式的语法:
-
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(* *.*(..)) 避免
-
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 前置通知
5.2后置通知
5.3环绕通知
5.4异常通知
三、AOP的概念
AOP(Aspect Oriented Programming) 面向切面编程
OOP(Object Oriented Programming) 面向对象编程
AOP:从切面(切入点+通知)入手,基于spring的动态代理 给目标类 增加 额外 功能。
切面:
额外功能:
通知:
切入点:
目标类:
目标方法:
AOP的使用场景:给目标类 增加 额外功能时 使用。
AOP的好处:解耦合。
AOP动态代理有两种实现方式 :
- Proxy JDK的反射包,aop默认采用
动态代理类 实现(目标类实现的)接口。
-
CGLIB 开源(对JDK的proxy进行了封装)
动态代理类 扩展目标类。
JDK的底层实现:
修改动态代理为CGLIB:
四、S2SM基于注解式开发
spring2.X引入了注释式开发。
作用:1) 简化spring.xml的配置
2) 降低了java代码的可读性
1.IOC相关
- 注解包扫描: