1 Spring的注解的AOP的通知类型
1.1 applicationContext.xml的配置
<!-- 在配置文件中开启注解的AOP的开发 -->
<aop:aspectj-autoproxy />
<bean id="orderDao" class="com.itykd.dao.OrderDao"/>
<bean id="myAspect" class="com.itykd.aspect.MyAspect"/>
1.2 @Before:前置通知
- 这里对OrderDao类的save方法增强
package com.itykd.aspect;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class MyAspect {
@Before(value="execution(* com.itykd.dao.OrderDao.save(..))")
public void before() {
System.out.println("前置增强===");
}
}
1.3 @AfterReturning:后置通知(可以获得返回值)
- 这里对OrderDao类的delete方法增强
- delete方法
public String delete() {
System.out.println("删除订单....");
return "ykd";
}
- 后置增强方法(注解中的returning=“result”要与afterReturing方法参数的名字result一样,而且参数类型必须为Object)
@AfterReturning(value="execution(* com.itykd.dao.OrderDao.delete(..))",returning="result")
public void afterReturning(Object result) {
System.out.println("后置增强==="+result);
}
1.4 @Around:环绕通知
@Around(value="execution(* com.itykd.dao.OrderDao.find(..))")
public Object surround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("环绕前增强...");
Object obj = joinPoint.proceed();
System.out.println("环绕后增强...");
return obj;
}
1.5 @AfterThrowing:异常抛出通知
@AfterThrowing(value="execution(* com.itykd.dao.OrderDao.update(..))",throwing="e")
public void afterThrowing(Throwable e) {
System.out.println("异常抛出增强..."+e.getMessage());
}
1.6 @After:最终通知
@After(value="execution(*com.itykd.dao.OrderDao.update(..))")
public void after() {
System.out.println("最终增强...");
}
1.7 测试代码
package com.itykd.spring.aop;
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;
import com.itykd.dao.OrderDao;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringAOPDemo {
@Resource(name="orderDao")
private OrderDao orderDao;
@Test
public void aopAnnotationDemo() {
orderDao.save();
orderDao.delete();
orderDao.update();
orderDao.find();
}
}
2 Spring的注解的AOP的切入点的配置
- 上述还有一个问题,就是我们在有很多通知要作用于同一个方法的时候,需要一个个改注解,因此就有了切入点的注解。切入点的配置如下:
@Pointcut(value="execution(* com.itykd.dao.OrderDao.update(..))")
private void pointcut1() {}
@Pointcut(value="execution(* com.itykd.dao.OrderDao.find(..))")
private void pointcut2() {}
@Pointcut(value="execution(* com.itykd.dao.OrderDao.save(..))")
private void pointcut3() {}
@Pointcut(value="execution(* com.itykd.dao.OrderDao.delete(..))")
private void pointcut4() {}
对应关系如下图: