Spring AOP相关详细
spring中基于xml的AOP配置步骤
1.把通知Bean也交给spring来管理
2.使用aop:config标签表明开始AOP的配置
3.使用aop:aspect标签表明配置切面,id属性是给切面提供一个唯一标识,ref属性指定通知类bean的id
4.在aop:aspect标签内部使用对应标签来配置通知的类型,aop:before表示配置前置通知,method属性用于指定
Logger类中那个方法是前置通知。pointcut属性:用于指定切入点表达式,指的是对业务层中那些方法增强。
切入点表达式的写法:关键字:execution表达式,访问修饰符 返回值 包名.类名.方法名(参数名)
访问修饰符可以省略,返回值可以使用通配符表示可以返回任意值,包名可以使用通配符表示任意包,但是有几级包
就需要写几个*,包名可以 使用..表示当前包及其子包。
类名和方法名都可以使用*来实现通配
参数列表可以直接写数据类型:基本数据类型直接写名称,引用类型写包名.类名的方式,可以使用通配符表示任意类型
但是必须有参数。可以使用..表示有无参数均可,有参数可以是任意类型。
全通配写法:* *..*.*(..)
实际开发中切入点表达式的通常写法:切到业务层实现类下的所有方法 * com.lut.service.impl.*.*(..)
1.配置切入点
配置切入点表达式,id属性用于指定表达式的唯一标识,expression用于指定表达式内容
此标签写在aop:aspect标签内部只能当作切面使用
它还可以写在aop:aspect外面,此时就变成了所有切面可用
注意必须写在aspect之前
环绕通知:
/*
* 环绕通知
* 问题:当我们配置了环绕通知之后,切入点方法没有执行,而通知方法执行了
* 通过对比动态代理中的环绕通知代码,发现动态代理的环绕通知有明确的切入点方法调用
* 解决:Spring框架中提供了一个接口,ProceedingJoinPoint该接口有一个方法proceed()此方法相当于
* 明确调用切入点方法,该接口可以作为环绕通知的方法参数,在程序执行时,spring框架会为我们提供
* 该接口的实现类供我们使用
*
* spring环绕通知spring框架提供的一种在代码中手动控制增强方法何时执行的方式
* */
<!--配置切面-->
<aop:aspect id="logAdvice" ref="logger">
<!--配置前置通知:在切入点方法执行之前执行-->
<aop:before method="beforePrintLog" pointcut-ref="pt1"></aop:before>
<!--配置后置通知:在切入点方法正常执行之后执行,和异常通知只能执行一个-->
<aop:after-returning method="afterReturningPrintLog" pointcut-ref="pt1"></aop:after-returning>
<!--配置异常通知:在切入点方法执行产生异常之后执行,和后置通知只能执行一个-->
<aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="pt1" ></aop:after-throwing>
<!--配置最终通知:无论切入点方法时候正常执行它都会在其后面执行-->
<aop:after method="afterPrintLog" pointcut-ref="pt1"></aop:after>
配置环绕通知 详细注释在Logger类中
<aop:around method="aroundPrintLog" pointcut-ref="pt1"></aop:around>
</aop:aspect>
2.jdbcTemplate最基本用法
//准备数据源:spring内置数据源
DriverManagerDataSource ds=new DriverManagerDataSource();
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/spring?serverTimezone=UTC");
ds.setUsername("root");
ds.setPassword("123456");
//1创建jdbcTemplate对象
JdbcTemplate jt=new JdbcTemplate();
//给jdbcTemplate设置数据源
jt.setDataSource(ds);
//2执行操作
jt.execute("insert into student(name,major) values ('ccc',computer)");
3.spring中基于xml的声明式事务控制配置步骤
1配置事务管理器
2.配置事务的通知:导入事务的约束,使用tx:advice标签配置事务通知,属性:id给事务通知一个唯一标识,
transaction-manager:给事务通知提供一个事务管理器引用
3.配置AOP中的同用切入点表达式
4.建立事务通知和切入点表达式的对应关系
5.配置事务的属性:实在事务的通知tx:advice标签的内部
isolation="指定事务的隔离级别默认default表示使用数据库的默认隔离级别"
no-rollback-for="用于指定一个异常,当产生该异常时事务不回滚,产生其他异常时事务回滚,没有默认值表示都回滚"
rollback-for="用于指定一个异常产生时事务回滚,产生其他异常时事务回滚,没有默认值,表示
任何异常都回滚"
propagation="用于指定事务的传播行为,默认是REQUIRED 表示一定有事务,增删改的选择,查询可以选择SUPPORTS"
read-only="指定事务是否只读,查询方法才能设置为true,默认值false"
timeout="用于指定事务的超时时间,默认值-1,表示永不超时,如果指定数值以秒为单位"