面向切面编程是对面向对象的一种补充,当我们在处理许多功能共有的需求时(系统需求),例如 日志管理,权限检查,事务管理的时候都可以使用aop.它简单方便而且耦合度极低。
这里展示一下日志管理:我们需要在用户访问一些方法时,打印出日志
@Component
@Aspect //声明这是一个切面组件
public class ServiceLogAspect {
private static final Logger logger = LoggerFactory.getLogger(ServiceLogAspect.class);
//描述哪些方法需要织入代码
@Pointcut("execution(* com.nowcoder.community.service.*.*(..))")
public void pointcut() {
}
@Before("pointcut()") //在切点前面
public void before(JoinPoint joinPoint) {
// 用户[1.2.3.4],在[xxx],访问了[com.nowcoder.community.service.xxx()].
//利用RequestContextHolder工具类调用getRequestAttributes()得到request对象
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());
//得到类名+方法名
String target = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();
logger.info(String.format("用户[%s],在[%s],访问了[%s].", ip, now, target));
}
}