1. Aop简介
1.1 Aop使用的代理技术
jdk
代理:基于接口的动态代理技术cdlib
代理:基于父类的动态代理技术
1.2 Aop相关概念
target
:代理的目标对象proxy
:代理,目标对象增强后产生joinpoint
:连接点,被拦截的点,spring中指方法pointcut
:切入点,对哪写连接点进行拦截的定义advice
:通知,增强aspect
:切入点 + 通知weaving
:增强目标对象来创建新的对象的过程。
1.3 Aop开发步骤
- 导入坐标
- 编写目标类和目标方法(target)
- 编写切面类中通知(advice)
- 将目标和切面类的实例放在spring容器中
- 配置织入关系
2. Aop快速入门
-
导入坐标
<!--导入spring的context坐标,context依赖aop--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.5.RELEASE</version> </dependency> <!-- aspectj的织入 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.13</version> </dependency>
-
创建目标类
public class Target { // method就是切点 public void method() { System.out.println("Target running...."); } }
-
创建切面类
public class MyAspect { public void before(){ System.out.println("前置代码增强....."); } }
-
将目标和切面类的实例放在spring容器中
<!--配置目标类--> <bean id="target" class="xxx.Target"></bean> <!--配置切面类--> <bean id="myAspect" class="xxx.MyAspect"></bean>
-
配置织入关系
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <aop:config> <!--引用myAspect的Bean为切面对象--> <aop:aspect ref="myAspect"> <!--配置Target的method方法执行时要进行myAspect的before方法前置增强--> <aop:before method="before" pointcut="execution(public void 包名.Target.method())"></aop:before> </aop:aspect> </aop:config> </beans>
3. 配置解释
3.1 切点表达式
execution([修饰符] 返回值类型 包名.类名.方法名(参数))
配置规则:
- 修饰符可以省略
- 返回值类型包名类名方法名可以用*表示任意
- 包名和类名中的
.
表示当前包下的类,..
表示当前包及其子包下的类 - 参数列表
..
表示任意个数,任意类型的参数列表
3.2 通知的类型
- 前置通知:
<aop:before>
- 后置通知:
<aop:after-returning>
- 环绕通知:
<aop:around>
- 异常抛出通知:
<aop:throwing>
- 最终通知:
<aop:after>
3.3 切点表达式抽取
<aop:pointcut id="xx" expression="execution(*.*.*(..))"
4. 注解开发
- 将目标类的切面类的创建权交给
spring
- 标注切面类和切点表达式
- 开启
aop
自动代理
@Component("target") // 第一步
public class Target {
public void method() {
System.out.println("Target running....");
}
}
@Component // 第一步
@Aspect // 第二步
public class MyAspect {
@Before("execution(* *.*.*(..))")
public void before(){
System.out.println("前置代码增强.....");
}
}
// 组件扫描
<context:component-scan base-package=""</context:component-scan>
// 自动代理
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
4.1 切点表达式抽取
@Component // 第一步
@Aspect // 第二步
public class MyAspect {
@Before("MyAspect.point()")
public void before(){
System.out.println("前置代码增强.....");
}
@Pointcut("execution(* *.*.*(..))")
public void point() {}
}
4.2 通知注解类型
- 前置通知:
@Before
- 后置通知:
@AfterReturning
- 环绕通知:
@Around
- 异常抛出通知:
@AfterThrowing
- 最终通知:
After