一,动态代理
特点:字节码随用随创建,随用随加载
作用:不修改源码的基础上对方法增强
分类:
基于接口的动态代理
基于子类的动态代理
1.1 基于接口的动态代理
涉及的类:Proxy
如何创建代理对象: 使用Proxy类中的newProxyInstance方法
创建代理对象的要求:被代理类最少实现一个接口,如果没有则不能使用
newProxyInstance方法的参数:
ClassLoader:类加载器
它是用于加载代理对象字节码的,和被代理对象使用相同的类加载器。固定写法。
Class[]:字节码数组
它是用于让代理对象和被代理对象有相同方法。固定写法。
InvocationHandler:用于提供增强的代码
它是让我们写如何代理,我们一般都是写一个该接口的实现类,通常情况下都是匿名内部类,但不是必须
的,此接口的实现类都是谁用谁写。
1.2 基于子类的动态代理
涉及的类:Enhancer
如何创建代理对象: 使用Ehance类中的create方法
创建代理对象的要求:被代理类不能是最终类
Enhancer方法的参数:
Class:字节码
它是用于指定被代理对象的字节码。
Callback:用于提供增强的代码
我们一般是实现methodInterceotor方法。
二,面向切面编程AOP
2.1 spring中的基于XML的AOP配置步骤
-
1,把通知bean也交给spring来管理
-
2,使用aop:config标签表明开始AOP的位置
-
3,使用aop:aspect标签表明配置切面
id属性:是给切面提供一个唯一标识 ref属性:是指定通知类bean的ID
-
4,在aop:aspect标签的内部使用对应标签来配置通知的类型
aop:before :表示配置的前置通知 aop:after-returning:表示配置的后置通知 aop:after-throwing:表示配置的异常通知 aop:after:表示配置的最终通知 method属性:用于指定Logger类中哪个方法是前置通知 pointcut属性:用于指定切入点表达式,该表达式的含义指的是对业务层中哪些方法增强
2.2 切入点表达式写法
切入点表达式的写法:
关键字:execution(表达式)
表达式:访问修饰符 返回值 包名.包名.包名...类名.方法名(参数列表)
标准的表达式写法(单个方法)
public void com.star.service.impl.AccountServiceImpl.saveAccount()
访问修饰符可以省略
void com.star.service.impl.AccountServiceImpl.saveAccount()
返回值可以使用通配符,表示任意返回值
* com.star.service.impl.AccountServiceImpl.saveAccount()
包名可以使用通配符,表示任意包。但是有几级包,就需要写几个*。
* *.*.*.*.AccountServiceImpl.saveAccount()
包名可以使用..表示当前包及子包
类名和方法名都可以使用*号来实现通配
* *..*.*()
参数列表:
可以直接写数据类型:
基本类型直接写名称
引用类型写包名.类名的方式 java.lang.String
可以使用通配符表示任意类型,但是必须有参数
可以使用..表示有无参数均可
全通配方法:* *..*.*(..)
实际开发中切入点表达式的通常写法:
切到业务层实现类下的所有方法
* (业务层类).*.*(..)
2.3 配置切入点表达式
- id属性用于指定表达式的唯一标识
- expression属性用于指定表达式内容
- 此标签写在aop:aspect的内部职能当前切面使用
- 它还可以写在aop:aspect的外面,此时变成了所有标签可用(注:只能写在切面上部)
<aop:pointcut id="pt1" expression="execution(* com.star.service.impl.*.*(..))"></aop:pointcut>
2.4 环绕通知
Spring框架为我们提供了一个接口,ProceedingJoinPoint,该接口有一个方法proceed(),此方法就相当于明确调用切入点方法。该接口可以作为环绕通知的方法参数,在程序执行时,spring框架为我们提供该接口的实现类供我们使用。
spring中的环绕通知:
它是spring框架为我们提供的一种可以在代码中手动控制增强方法何时执行的方式。
三,AOP中的注解
1,@Aspect
表示当前类是一个切面类
2, @Pointcut
用于指定切入点
@Pointcut("execution(* com.star.service.impl.*.*(..))")
3,指定通知
- @Before("") 前置通知
- @AfterReturning("") 后置通知
- @AfterThrowing("") 异常通知
- @After("") 最终通知
- @Around(“”) 环绕通知
四,spring基于XML的事务控制
1,配置事务管理器
2,配置事务的通知
此时我们需要导入事务的约束 tx名称空间和约束,同时也需要aop的
使用tx:advice标签配置事务通知
属性:
id:给事务通知起一个唯一标识
transaction-manager:给事务通知提供一个事务管理器引用
3,配置AOP中的通用切入点表达式
4,建立事务通知和切入点表达式的对应关系
5,配置事务的属性
是在事务的通知tx:advice标签的内部
配置事务的属性:
isolation="" 指定事务的隔离级别,默认值是default,表示使用数据库的默认隔离级别
propagation="" 用于指定事务的传播行为。默认值是REQUIRED,表示一定会有事务,增
删改的选择。查询方法可以选择SUPPORTS。
read-only="" 用于指定事务是否只读。只有查询方法才能设置为true。默认值是
false,表示读写。
rollback-for="" 用于指定一个异常,当产生该异常时,事务回滚。产生其他异常时,事
务不回滚。没有默认值,表示任何异常都回滚
no-rollback-for="" 用于指定一个异常,当产生该异常时,事务不会滚,产生其他异常
时事务回滚,没有默认值,表示任何异常都不回滚
timeout="" 用于指定事务的超出时间,默认值是-1,表示永不超时。如果指定了数
值,以秒为单位
五,spring中基于注解的事务控制
1,配置事务管理器
2,开启spring对注解事务的支持
3,在需要事务支持的地方使用@Transactional注解