1.AOP简介
Aspect Oriented Programming 面向切面编程,指的是在不惊动原始设计的基础上为其进行功能增强
Spring理念:无侵入式编程
AOP入门案例-使用aop在update()方法上打印当前系统时间
1.导入AOP相关坐标
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
注意:spring-context坐标包含spring-aop坐标
2.定义dao接口和实现类
dao接口:
package com.itheima.dao;
public interface BookDao {
public void save();
public void update();
}
实现类:
package com.itheima.dao.impl;
import com.itheima.dao.BookDao;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;
@Repository
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println(System.currentTimeMillis());
System.out.println("book dao save ...");
}
public void update() {
System.out.println("bookupadte");
}
}
3.定义通知类,制作通知
注意:切入点定义依托于一个不具有任何意义的方法进行,无参,无返回值,方法体无实际逻辑
@Component表示将该类交给spring容器来管理
@Aspect 表示该类为通知类,使其功能生效
@Pointcut声明该方法为切入点
@Before 表示在切入点之前执行通知
4.开启spring对aop注解驱动支持-@EnableAspectJAutoProxy
AOP核心概念
目标对象:原始功能去掉共性功能对应的类产生的对象,这种对象是无法完成最终工作的
代理:目标对象无法直接完成工作,需要对其进行功能回填,通过原始对象的代理对象来实现
SpringAOP本质:代理模式
AOP切入点表达式
切入点:要进行增强的方法
切入点表达式:要进行增强的方法的描述方式
AOP通知
1.通知类型
前置通知
@Before在切入点之前执行
后置通知
@After在切入点之后执行
环绕通知
@Around围绕着方法执行
//获取原始方法的方法类型和方法名
Signature signature=pjp.getSignature();
//方法类型
signature.getDeclaringTypeName();
//方法名称
signature.getName();
返回后通知
@AfterReturning 原方法正常运行完成后执行
抛出异常后通知
@AfterThrowing 原方法抛出异常后执行
2.获取通知数据
1.获取原方法参数
Object[] args=jp.getArgs();
环绕通知中在调用原方法的同时可以接收参数
//接收参数
Object[] args=pip.getArgs();
//修改参数
args[0]=66;
//传递参数
pip.proceed(args);
2.接收原方法的返回值
注意:形参JoinPoint必须在前
3.异常
1.Spring事务简介
事务作用:在数据层保障一系列的数据库操作同成功同失败
Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败
1.在业务层接口上添加Spring事务管理
设置事务管理器
PlatformTransactionManager为Spring定义的事务接口
DataSourceTransactionManager为其实现类,内部使用JDBC事务
3.开启注解驱动事务
事务角色
事务的属性
事务配置
事务的传播行为:事务协调员对事务管理员所携带的事务的处理态度(可以使两者不同为一个事务)
//开启新的事务
@Transactional(Propagation=Propagation.REQUIRES_NEW)