目录
@EnableTransactionManagement开启事务支持
什么是AOP
AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构
AOP是在不改原有代码的前提下对其进行增强。
Spring的AOP,在不惊动(改动)原有设计(代码)的前提下,想给谁添加功能 就给谁添加。
AOP中的基本概念
给实现方法我们给起了一 个名字叫连接点
对于需要增强的方法我们给起了一个名字叫切入点
存放共性功能的方法,我们给起了个名字叫通知,方法不能独立存在需要被写在一个类中,这个类我们也给起了个名字叫通知类
通知和切入点之间的关系描述,我们 给起了个名字叫切面
AOP注解开发
首先需要给pom.xml添加依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
然后创建通用类(就不多描述了,主要看用得到的注解)
切入点注解@Pointcut
@Pointcut("execution(void com.ycx.dao.BookDao.update())")
// ↑ ↑ ↑ ↑ ↑ ↑
// 类型 (包 名) 类名 要增强的方法
public class MyAdvice {
@Pointcut("execution(void com.ycx.dao.BookDao.update())")
private void pt(){}
@Before("pt()")
public void method(){
System.out.println(System.currentTimeMillis());
}
}
绑定切入点与通知关系,并指定通知添加到原始连接点的具体执行位置
@Aspect
将通知类配给容器并标识其为切面类
@EnableAspectJAutoProxy
在SpringConfig类中开启注解格式AOP功能
@Configuration
@ComponentScan("com.ycx")
@EnableAspectJAutoProxy //开启Aop注解
public class SpringConfig {
}
AOP工作流程
AOP切入点表达式
eg:
execution(public User com.ycx.service.UserService.findById(int))
execution:动作关键字,描述切入点的行为动作,例如execution表示执行到指定切入点
public:访问修饰符,还可以是public,private等,可以省略
User:返回值,写返回值类型
com.ycx.service:包名,多级包使用点连接
UserService:类/接口名称
findById:方法名 int:参数,直接写参数的类型,多个类型用逗号隔开
异常名:方法定义中抛出指定异常,可以省略(此处省略)
表达式通配符
* :单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的匹配符出现
execution(public * com.ycx.*.UserService.find*(*))
.. :多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写
execution(public User com..UserService.findById(..))
+:专用于匹配子类类型,使用率较低。
execution(* *..*Service+.*(..))
AOP通知类型
前置通知 @Before注解
后置通知 @After注解
环绕通知(重点) @Around注解
返回后通知(了解) @AfterReturning注解
抛出异常后通知(了解) @AfterThrowing注解
事务绑定
@Transactional
@Transactional可以写在接口类上、接口方法上、实现类上和实现类方法上