spring AOP运行时植入代码,代理实现,比aspectj更加具有性价比,但是功能不如他强大。他们都是基于AOP
代理两种方式,JDK是自带的,CGLib是第三方的。JDK是自带的,CGLib是第三方的。使用JDK,目标对象必须有接口,代理对象就是生成接口的一个实现类。我们的service没有,所以用不来。拎一个通过子类作为代理对象。
代理都是操作他的代理类。
之前我们针对controller表现层的异常统一处理了,并且记录了日志
这次我们记录下,所有访问service方法的业务代码。
Component
@Aspect
public class ServiceLogAspect {
private static final Logger logger = LoggerFactory.getLogger(ServiceLogAspect.class);
/**
* 第一个* 表示所有返回值 xx包下的所有类 方法 参数。都要处理
*/
@Pointcut("execution(* com.cjh.community.service.*.*(..))")
public void pointcut(){
}
@Before("pointcut()")
public void before(JoinPoint joinPoint){
//这个工具类可以获取请求,用强转为子类,功能更多
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String ip = request.getRemoteHost();
String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
//调用的类及其方法名,记录下来.xx.xx.service.xxx()
String target = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();
logger.info(String.format("用户[%s],在[%s],访问了[%s].",ip,now,target));
}