Spring aop

2017-03-30  本文已影响0人  随风而逝1027

两种方法配置

http://www.cnblogs.com/davidwang456/p/4013631.html

1.注解

1)Aspect定义一个切面 在切面定义切入点@Pointcut

并定义通知类型@Before @AfterReturning @After @AfterThrowing @Around

2)开发需要被拦截的类

3)将切面配置到xml中,也可以使用自动扫描Bean的方式,交由SpringAop容器管理

需要引用的jar包aspectjweaver.jar aspectjrt.jar

@Component

//声明这是一个切面Bean

@Aspect

public class ServiceAspect {

private final static Log log = LogFactory.getLog(ServiceAspect.class);

//配置切入点,该方法无方法体,主要为方便同类中其他方法使用此处配置的切入点

@Pointcut("execution(* cn.ysh.studio.spring.aop.service..*(..))")

public void aspect(){ }

/*

* 配置前置通知,使用在方法aspect()上注册的切入点

* 同时接受JoinPoint切入点对象,可以没有该参数

*/

@Before("aspect()")

public void before(JoinPoint joinPoint){

if(log.isInfoEnabled()){

log.info("before " + joinPoint);

}

}

//配置后置通知,使用在方法aspect()上注册的切入点

@After("aspect()")

public void after(JoinPoint joinPoint){

if(log.isInfoEnabled()){

log.info("after " + joinPoint);

}

}

//配置环绕通知,使用在方法aspect()上注册的切入点

@Around("aspect()")

public void around(JoinPoint joinPoint){

long start = System.currentTimeMillis();

try {

((ProceedingJoinPoint) joinPoint).proceed();

long end = System.currentTimeMillis();

if(log.isInfoEnabled()){

log.info("around " + joinPoint + "\tUse time : " + (end - start) + " ms!");

}

} catch (Throwable e) {

long end = System.currentTimeMillis();

if(log.isInfoEnabled()){

log.info("around " + joinPoint + "\tUse time : " + (end - start) + " ms with exception : " + e.getMessage());

}

}

}

//配置后置返回通知,使用在方法aspect()上注册的切入点

@AfterReturning("aspect()")

public void afterReturn(JoinPoint joinPoint){

if(log.isInfoEnabled()){

log.info("afterReturn " + joinPoint);

}

}

//配置抛出异常后通知,使用在方法aspect()上注册的切入点

@AfterThrowing(pointcut="aspect()", throwing="ex")

public void afterThrow(JoinPoint joinPoint, Exception ex){

if(log.isInfoEnabled()){

log.info("afterThrow " + joinPoint + "\t" + ex.getMessage());

}

}

}

2.xml方式

上一篇下一篇

猜你喜欢

热点阅读