Spring 框架的AOP之注解的方式
1. 环境搭建
1.1 导入 jar 包
- Spring 框架的基本开发包(6个);
- Spring 的传统AOP的开发包
spring-aop-4.3.10.RELEASE
org.aopalliance-1.10.0
(在 Spring 依赖包中)
- aspectJ 的开发包
org.aspectj.weave-1.6.8.RELEASE.jar
(在 Spring 依赖包中)spring-aspects-4.3.10.RELEASE.jar
1.2 编写 applicationContext.xml 配置文件
<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
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/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 开启自动代理 -->
<aop:aspectj-autoproxy/>
<!-- 配置目标对象 customerDao -->
<bean id="customerDao" class="com.itheima.demo.CustomerDaoImpl"/>
<!-- 配置切面类 -->
<bean id="myAspectAnno" class="com.itheima.demo.MyAspectAnno"/>
</beans>
1.3 创建包结构,编写具体的接口和实现类
com.itheima.demo
CustomerDao
: 接口;CustomerDaoImpl
: 实现类;
- 在 applicationContext.xml 中配置
// CustomerDao.java
public interface CustomerDao{
public void save();
}
// CustomerDaoImpl.java
public class CustomerDaoImpl{
public void save(){
System.out.println("保存客户...");
}
}
// 编写测试方法
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo{
@Resource(name="customerDao")
private CustomerDao customerDao;
@Test
public void fun(){
customerDao.save();
}
}
// 编写切面类
@Aspect
public class MyAspectAnno{
// 通知(增前方法)
// @Before(切入点表达式)
@Before(value="execution(public void com.itheima.demo.CustomerDaoImpl.save())")
public void log(){
System.out.println("记录日志...");
}
}
1.4 在 applicationContext.xml 中开启自动代理
<aop:aspectj-autoproxy
/>
1.5 通知类型
@Before
: 前置通知;@AfterReturning
: 后置通知;@Around
: 环绕通知;@After
: 最终通知;@AfterThrowing
: 异常抛出通知;
1.6 配置通用的切入点
- 使用
@Pointcut
配置通用的切入点
// 示例
@Aspect
public class MyAspectAnno{
@Before(value="MyAspectAnno.fn()")
public void log(){
System.out.println("记录日志...");
}
@After(value="MyAspectAnno.fn()")
public void after(){
System.out.println("最终通知...");
}
// 自定义切入点
@Pointcut(value="execution(public void com.itheima.demo.CustomerDaoImpl.save())")
public void fn(){}
}
参考资料