Spring 框架的AOP之注解的方式

时间:2023-03-09 22:59:32
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(){}
}

参考资料