目录
一、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注解方式的切入点的注解
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("删除订单...");
}
}
package com.rosinanate.spring.demo1;
/**
* 切面类 注解的切面类
* @author Administrator
*
*/
public class MyAspectAnno {
public void before(){
System.out.println("前置增强...");
}
}
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("前置增强...");
}
}
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();
}
}
运行结果如下:
见上例。
为了测试,先将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);
}
运行结果如下:
对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;
}
运行结果如下:
更改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());
}
运行结果如下:
@After(value = "execution(* com.rosinanate.spring.demo1.OrderDao.find(..))")
public void after(){
System.out.println("最终增强...");
}
运行结果如下:
如果某一个方法我们进行了多次增强,例如上例中的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("最终增强...");
}