快速入门
- 导入AOP相关坐标
1 2 3 4 5 6 7 8 9 10
| <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.13</version> </dependency>
|
- 创建目标接口和目标类(内部有切点)
1 2 3 4 5 6 7 8 9 10 11
| package cn.imqinhao.aop;
public interface TargetInterface {
public void save();
}
|
1 2 3 4 5 6 7 8 9 10 11 12
| package cn.imqinhao.aop;
public class Target implements TargetInterface{ @Override public void save() { System.out.println("save running..."); } }
|
- 创建切面类(内部有增强方法)
1 2 3 4 5 6 7 8 9 10 11 12 13
| package cn.imqinhao.aop;
public class MyAspect {
public void before() { System.out.println("前置增强..."); }
}
|
- 将目标类和切面类的对象创建权交给Spring
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd ">
<bean id="target" class="cn.imqinhao.aop.Target" />
<bean id="myAspect" class="cn.imqinhao.aop.MyAspect" />
</beans>
|
- 在 applicationContext.xml 中配置织入关系
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd ">
<bean id="target" class="cn.imqinhao.aop.Target" />
<bean id="myAspect" class="cn.imqinhao.aop.MyAspect" />
<aop:config> <aop:aspect ref="myAspect"> <aop:before method="before" pointcut="execution(public void cn.imqinhao.aop.Target.save())" /> </aop:aspect> </aop:config>
</beans>
|
测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| package cn.imqinhao.test;
import cn.imqinhao.aop.Target; import cn.imqinhao.aop.TargetInterface; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class AopTest {
@Autowired private TargetInterface target;
@Test public void test1() { target.save(); }
}
|
运行结果:
AOP切点表达式的写法
表达式语法:
1
| execution([修饰符] 返回值类型 包名.类名.方法名(参数))
|
- 访问修饰符可以忽略
- 返回值类型、包名、类名、方法名可以使用星号 * 代表任意
- 包名与类名之间一个点 . 代表当前包下的类,两个点 .. 表示当前包及其子包下的类
- 参数列表可以使用两个点 .. 代表任意个数,任意类型的参数列表
所以,上面的applicationContext.xml文件的第21行我们可以修改一下:
1
| <aop:before method="before" pointcut="execution(* cn.imqinhao.aop.*.*(..))" />
|
通知的类型
通知的配置语法:
1
| <aop:通知类型 method="切面类中方法名" pointcut="切点表达式"></aop:通知类型>
|
切点表达式的抽取
当多个增强的切点表达式相同时,可以将切点表达式进行抽取,在增强中使用pointcut-ref属性代替pointcut属性来引用抽取后的切点表达式。
接下来我们对 applicationContext.xml 进行优化:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd ">
<bean id="target" class="cn.imqinhao.aop.Target" />
<bean id="myAspect" class="cn.imqinhao.aop.MyAspect" />
<aop:config> <aop:aspect ref="myAspect"> <aop:pointcut id="myPointCut" expression="execution(* cn.imqinhao.aop.*.*(..))"/> <aop:around method="around" pointcut-ref="myPointCut" /> <aop:after method="after" pointcut-ref="myPointCut" /> </aop:aspect> </aop:config> </beans>
|
运行结果:
1 2 3 4
| 环绕前增强… save running… 环绕后增强… 最终增强…
|