面向切面编程AOP,前期准备工作:
引入jar包:
aspectjweaver.jar
aspectjrt.jar
cglib.jar (CBLIB的动态代理方式需要这个包)
配置文件:
<aop:aspectj-autoproxy/> 有了这个Spring就能够自动扫描被@Aspect标注的切面了,
下面这个proxy-target-class="true"表示采用CBLIB方式
<aop:aspectj-autoproxy proxy-target-class="true"/>
还要加入切面TestAspect.java:
<context:component-scan base-package="com.test.aspect"/>
TestAspect.java如下:
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
//此处注解不能少
@Component
@Aspect
public class TestAspect{
public static final Logger logger = LoggerFactory.getLogger(LogAspect.class);
@Pointcut("execution(* com.test.service.impl.*.login(..))")
public void logBefore(){
logger.info("logBefore");
}
@AfterReturning(pointcut = "execution(* com.test.service.impl.*.login(..))")
public void logAfter(){
logger.info("logAfter");
}
@Around("execution(* com.test.service.impl.*.login(..))")
public Object logAround(ProceedingJoinPoint pjp) throws Throwable{
logger.info("logAround");
Object o = null;
try {
o = pjp.proceed();
} catch (Throwable t) {
// 记录返回报文
throw t;
}
Object[] args= pjp.getArgs();
logger.info(args[0]+"logAround"+args[1]);
return o;
}
@Around("logBefore()")
public Object cutAround(ProceedingJoinPoint pjp) throws Throwable{
Object o = null;
try {
o = pjp.proceed();
} catch (Throwable t) {
// 记录返回报文
throw t;
}
Object[] args= pjp.getArgs();
logger.info("cutAround");
int len=args.length;
logger.info(args[len-1]+"cutAround"+args[0]);
return o;
}
// 调ServicClient切点
@Pointcut("execution(*
com.test.client.ServiceClient.request(..))&& args(request,seq,..)")
public void serviceClient(String request, String seq) {
}
// 调SocketClient,request()入参为String类型的切点
@Pointcut("execution(*
com.test.client.SocketClient.request(..))&& args(request,seq)")
public void socketStrClient(String request, String seq) {
}
@Around("serviceClient(request,seq)||socketStrClient(request,seq)")
public Object doServiceClient(ProceedingJoinPoint pjp, String request, String seq) throws Throwable {
//可加上其他逻辑处理
Object o = null;
try {
o = pjp.proceed();
} catch (Throwable t) {
// 记录返回报文
throw t;
}
Object[] args= pjp.getArgs();
logger.info("cutAround");
int len=args.length;
logger.info(args[len-1]+"cutAround"+args[0]);
return o;
}
// 调SocketClient切点
@Pointcut("execution(*
com.test.client.CardSocketClient.request(..))")
public void cardSocketClient() {
}
// 记录后台报文日志
@Around("cardSocketClient()&& args(sendbuf,seq,..)")
public Object doCardSocketClientAround(ProceedingJoinPoint pjp, byte[] sendbuf, String seq) throws Throwable {
//可加上其他逻辑处理
Object o = null;
try {
o = pjp.proceed();
} catch (Throwable t) {
// 记录返回报文
throw t;
}
Object[] args= pjp.getArgs();
logger.info("cutAround");
int len=args.length;
logger.info(args[len-1]+"cutAround"+args[0]);
return o;
}
// 后台DAO切点
@Pointcut("execution(* (com.test.dao.*.*Dao"
+ " && !com.test.dao.carddb.*"
+ " && !com.test.dao.ubgdb.*"
+ " && !com.test.dao.libdb.*"
+ ").*(..))")
public void dao() {
}
// 记录后台外调返回业务日志
@Around("dao()&& args(seq,..)")
public Object doDaoAround(ProceedingJoinPoint pjp, String seq) throws Throwable {
//可加上其他逻辑处理
Object o = null;
try {
o = pjp.proceed();
} catch (Throwable t) {
// 记录返回报文
throw t;
}
Object[] args= pjp.getArgs();
logger.info("cutAround");
int len=args.length;
logger.info(args[len-1]+"cutAround"+args[0]);
return o;
}
}