Spring学习笔记---Spring基于AspectJ的注解的AOP开发

目录

一、Spring基于AspectJ的注解的AOP开发

1.创建羡慕,引入jar包

 2.引入配置文件

3.编写目标类

4.编写切面类并配置

5.使用注解的AOP对目标类进行增强

 6.编写测试类

二、Spring的注解的AOP的通知类型

1.@Before:前置通知

2.@AfterReturning:后置通知

3.@Arround:环绕通知

4.@AfterThrowing:异常抛出通知

5.@After:最终通知

三、Spring AOP注解方式的切入点的注解


一、Spring基于AspectJ的注解的AOP开发

1.创建羡慕,引入jar包

Spring学习笔记---Spring基于AspectJ的注解的AOP开发_第1张图片

 2.引入配置文件


 
        
        
        

3.编写目标类

 

  • 编写一个订单类,类中有对订单的增删改查四个方法:
package com.rosinanate.spring.demo1;

public class OrderDao {
	
	public void save(){
		System.out.println("保存订单...");
	}
	public void update(){
		System.out.println("修改订单...");
	}
	public void find(){
		System.out.println("查询订单...");
	}
	public void delete(){
		System.out.println("删除订单...");
	}
}
  • 配置该目标类

4.编写切面类并配置

  • 编写切面类
package com.rosinanate.spring.demo1;
/**
 * 切面类 注解的切面类
 * @author Administrator
 *
 */
public class MyAspectAnno {
	
	public void before(){
		System.out.println("前置增强...");
	}
}
  • 配置切面类


        

5.使用注解的AOP对目标类进行增强

  • 在配置文件中打开注解的AOP开发

  • 在切面类上使用注解
package com.rosinanate.spring.demo1;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

/**
 * 切面类 注解的切面类
 * @author Administrator
 *
 */

@Aspect
public class MyAspectAnno {
	
	@Before(value = "execution(* com.rosinanate.spring.demo1.OrderDao.save(..))")
	public void before(){
		System.out.println("前置增强...");
	}
}

 6.编写测试类

  • Spring整合Junit测试
package com.rosinanate.spring.demo1;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * Spring的AOP的注解开发
 * @author Administrator
 *
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringDemo1 {
	@Resource(name="orderDao")
	public OrderDao orderDao;
	
	@Test
	public void demo1(){
		orderDao.save();
		orderDao.update();
		orderDao.delete();
		orderDao.find();
	}
}

运行结果如下:

Spring学习笔记---Spring基于AspectJ的注解的AOP开发_第2张图片

二、Spring的注解的AOP的通知类型

1.@Before:前置通知

见上例。

2.@AfterReturning:后置通知

  • 利用后置通知获取方法返回值

为了测试,先将delete改为有返回值的方法:

public String delete(){
	System.out.println("删除订单...");
	return "fanhuizhi";
}

 增强delete方法,配置后置通知,并获取返回值:

@AfterReturning(value = "execution(* com.rosinanate.spring.demo1.OrderDao.delete(..))",returning="result")
public void afterReturning(Object result){
	System.out.println("后置增强..."+result);
}

运行结果如下:

Spring学习笔记---Spring基于AspectJ的注解的AOP开发_第3张图片

3.@Arround:环绕通知

对update方法增强:

@Around("execution(* com.rosinanate.spring.demo1.OrderDao.update(..))")
public Object arround(ProceedingJoinPoint joinPoint) throws Throwable{
	System.out.println("环绕前增强...");
	Object obj = joinPoint.proceed();
	System.out.println("环绕后增强...");
	return obj;
}

运行结果如下:

Spring学习笔记---Spring基于AspectJ的注解的AOP开发_第4张图片

4.@AfterThrowing:异常抛出通知

更改find方法,使其抛出异常:

public void find(){
	System.out.println("查询订单...");
	int d = 1/0;
}

增强find方法,并得到其异常信息:

@AfterThrowing(value = "execution(* com.rosinanate.spring.demo1.OrderDao.find(..))",throwing = "e")
public void afterThrowing(Throwable e){
	System.out.println("异常抛出增强..."+e.getMessage());
}

运行结果如下:

Spring学习笔记---Spring基于AspectJ的注解的AOP开发_第5张图片

5.@After:最终通知

@After(value = "execution(* com.rosinanate.spring.demo1.OrderDao.find(..))")
public void after(){
	System.out.println("最终增强...");
}

运行结果如下:

Spring学习笔记---Spring基于AspectJ的注解的AOP开发_第6张图片

三、Spring AOP注解方式的切入点的注解

如果某一个方法我们进行了多次增强,例如上例中的find方法,我们增强了异常抛出通知、最终通知,如果我们需要修改这些通知,必须一个一个的修改切入的方法,那么我们使用pointcut注解,来进行切入点的注解,类似于xml配置中的pointcut1、pointcut2等配置。

以find方法为例,配置切入点:

@Pointcut(value = "execution(* com.rosinanate.spring.demo1.OrderDao.find(..))")
private void pointcut1(){}

这个pointcut1方法其实是没有任何意义的,只是为了配置切入点。

于是find的异常抛出增强和最终增强都可以使用如下方式:

@AfterThrowing(value = "MyAspectAnno.pointcut1()",throwing = "e")
public void afterThrowing(Throwable e){
	System.out.println("异常抛出增强..."+e.getMessage());
}

@After(value = "MyAspectAnno.pointcut1()")
public void after(){
	System.out.println("最终增强...");
}

 

 

你可能感兴趣的:(Spring,Spring,Java)