1 创建项目,引入jar包
<!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/aspectj/aspectjrt -->
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.5.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
2. 引入配置文件
<?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">
</beans>
3.创建目标类
public class OrderDao {
public void save(){
System.out.println("保存订单========");
}
public void update(){
System.out.println("修改订单========");
}
public void delete(){
System.out.println("删除订单========");
}
public void find(){
System.out.println("查询订单========");
}
}
4.配置目标类
<!--配置目标类-->
<bean id="oraderDao" class="springdemo1.OrderDao"></bean>
5.编写切面类并且配置
public class MyAspectAnno {
public void before(){
System.out.println("前置增强=============");
}
}
<!--配置切面类-->
<bean id="myAspect" class="springdemo1.MyAspectAnno"></bean>
6.使用注解的AOP对象目标类进行增强
在配置文件中注解的AOP开发
<!--在配置文件种开启注解的AOP的开发-->
<aop:aspectj-autoproxy/>
在切面类上增加注释
@Aspect
public class MyAspectAnno {
@Before(value = "execution(* springdemo1.OrderDao.save(..))")//表达式
public void before(){
System.out.println("前置增强=============");
}
}
7.编写测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")//加载配置文件
public class SpringDemo1Test {
@Resource(name = "oraderDao")//配置文件对应的bean属性的ID
private OrderDao orderDao;
@Test
public void demo1(){
orderDao.save();
orderDao.update();
orderDao.delete();
orderDao.find();
}
}
8.运行结果
Spring的注解的AOP的通知类型
@Aspect:定义切面类的注解
通知类型:
*@Before:前置通知*@AfterReturing:后置通知*@Around:环绕通知*@After:最终通知*@AfterThrowing:异常抛出通知.@Pointcut:定义切入点的注解
@Before :前置通知
@Before(value = "execution(* springdemo1.OrderDao.save(..))")//表达式
public void before(){
System.out.println("前置增强=============");
}
@AfterReturning :后置通知
@AfterReturning(value = "execution(* springdemo1.OrderDao.delete(..))",returning ="result" )
public void afterreturning(Object result){
System.out.println("后置增强============="+result);
}
@Around :环绕通知
@Around(value = "execution(* springdemo1.OrderDao.update(..))")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("环绕前增强=============");
Object obj = joinPoint.proceed();
System.out.println("环绕后增强=============");
return obj;
}
@AfterThrowing :异常抛出通知
注意:find()函数里面必须要存在异常才会执行
public void find(){
System.out.println("查询订单========");
int i = 1/0;
}
@AfterThrowing(value = "execution(* springdemo1.OrderDao.find(..))",throwing = "e")
public void afterthrowing(Throwable e){
System.out.println("异常抛出增强========="+e.getMessage());
}
@After:最终通知
@After(value = "execution(* springdemo1.OrderDao.find(..))")
public void after(){
System.out.println("最终增强==============");
}
执行结果
Spring的AOP的注解切入点的配置
@Pointcut(value="execution(* springdemo1.OrderDao.find(..))")
private void pointcut1(){}
@Pointcut(value="execution(* springdemo1.OrderDao.save(..))")
private void pointcut2(){}
@Pointcut(value="execution(* springdemo1.OrderDao.update(..))")
private void pointcut3(){}
@Pointcut(value="execution(* springdemo1.OrderDao.delete(..))")
private void pointcut4(){}
配置完成切入点需要更改上面通知类型,配置与切入点相对应(只要更改切入点)
@Before(value = "MyAspectAnno.pointcut2()")
@AfterReturning(value = "MyAspectAnno.pointcut4()",returning ="result" )
@Around(value = "MyAspectAnno.pointcut3()")
@AfterThrowing(value = "MyAspectAnno.pointcut1()",throwing = "e")
@After(value = "MyAspectAnno.pointcut1()")