什么是AOP?
它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。如果说面向对象编程(oop)是水平扩展的话,那么aop则是纵向的扩展,使程序立体化。
定义一个注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Loggable {
/** 操作类型(INSERT、UPDATE、SELECT、DELETE)*/
public String optType();
/** 描述 */
public String describe();
/** 模块 */
public String module();
自定义注解
@Retention:标示注解在什么时候可见(运行时可见、仅在.class文件及源代码中可见、仅在源代码中可见),value可用参数有:
RetentionPolicy.RUNTIME 标示该注解可以再运行时通过反射找到(ORM框架许多注解使用了该参数)
RetentionPolicy.CLASS 标示该注解保存在.class文件中,但在运行时不能通过反射找到
RetentionPolicy.SOURSE 标示该注解只在源码中可见
@Target:标示该注解用于注解什么元素(类、方法、变量等),value可用参数有:
ElementType.PACKAGE 标示该注解用于注解包声明
ElementType.ANNOTATION_TYPE 标示该注解用于注解其他注解
ElementType.CONSTRUCTOR 标示该注解用于注解构造函数
ElementType.FIELD 标示该注解用于注解成员变量
ElementType.METHOD 标示该注解用于注解方法
ElementType.TYPE 标示该注解用于注解类,接口,枚举类型
ElementType.PARAMETER 标示该注解用于注解参数
ElementType.LOCAL_VARIABLE 标示该注解用于注解局部变量
定义一个切面类(根据项目情况在里面科将日志记录存到数据库):
@Aspect
@Component(value = "loggerAspect")
public class LoggerAspect {
private Logger logger = LoggerFactory.getLogger(LoggerAspect.class);
//切入点:* com.wb.wbao.web.*.*(..)路径下和使用了@Loggable注解的方法
@Pointcut("execution(public * com.wb.wbao.web.*.*(..)) && @annotation(com.wb.wbao.common.annotation.Loggable)")
public void log(){
}
@AfterReturning(value = "log()", returning = "retVal")
public void log(JoinPoint joinPoint, Object retVal) {
// 获取参数
Object[] params = joinPoint.getArgs();
// 获取方法名
String methodName = joinPoint.getSignature().getName();
Class<?> targetClass = joinPoint.getTarget().getClass();
Method method = null;
for (Method mt : targetClass.getMethods()) {
if (methodName.equals(mt.getName())) {
method = mt;
break;
}
}
Loggable loggable = method.getAnnotation(Loggable.class);
if(Objects.isNull(loggable)){
return;
}
logger.info("loggable desc:{}, optType:{}, module:{},params:{}", loggable.describe(), loggable.optType(), loggable.module(), params);
//loggable desc:登录, optType:POST, module:LOGIN,params:[User{loginName='wangbao', password='wangbao'}
}
@AfterThrowing(value = "log()", throwing = "ex")
public void log(JoinPoint joinPoint, Throwable ex) {
// 获取参数
Object[] params = joinPoint.getArgs();
// 获取方法名
String methodName = joinPoint.getSignature().getName();
Class<?> targetClass = joinPoint.getTarget().getClass();
Method method = null;
for (Method mt : targetClass.getMethods()) {
if (methodName.equals(mt.getName())) {
method = mt;
break;
}
}
Loggable loggable = method.getAnnotation(Loggable.class);
if(Objects.isNull(loggable)){
return;
}
logger.info("loggable desc:{}, optType:{}, module:{}, exception:{}, params:{}", loggable.describe(), loggable.optType(), loggable.module(), ex.getMessage(), params);
//loggable desc:登录, optType:POST, module:LOGIN, exception:/ by zero, params:[User{loginName='wangbao', password='wangbao'}
}
}
实际使用方法:
@Loggable(describe = "登录", optType = "POST", module = "LOGIN")
@RequestMapping(value = "/login", method = RequestMethod.POST)
@ResponseBody
public CommonDTO login(@RequestBody User user) {...}
相关推荐
总结,Spring MVC结合AOP和自定义注解可以方便地实现日志记录功能,无需侵入业务代码。这种方法具有良好的可扩展性和灵活性,可以轻松适应不同场景的日志需求。同时,通过调整切面的定义,我们可以控制日志记录的...
通过这种方式,我们可以在AOP中灵活地处理带有自定义注解的方法,实现如日志记录、性能监控、权限验证等多种功能。这不仅提高了代码的复用性,也使得业务逻辑更加清晰。 总结来说,Spring中的自定义注解和AOP的结合...
在本文中,我们将探讨如何使用 Spring AOP 实现日志管理,并使用自定义注解方式来记录日志信息。这种方式可以灵活地实现日志管理,提高系统的可维护性和可扩展性。 首先,我们需要在 applicationContext-mvc.xml ...
本实例将详细探讨如何通过注解(Annotation)来实现Spring AOP的方法拦截。 一、Spring AOP基础 Spring AOP是Spring框架的一部分,它提供了一种在运行时织入横切关注点(如日志、事务管理等)到目标对象的能力。AOP...
例如,`@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Loggable`,我们可以创建一个自定义注解`@Loggable`,然后在需要记录日志的方法上使用此注解。在切面中,...
在Spring框架中,自定义注解的解析是一个强大的特性,允许开发者根据业务需求创建特定的注解,并在Spring容器启动时自动处理这些注解。本文将深入探讨如何在Spring环境中通过`component-scan`配置来处理自定义Java...
AOP是一种编程范式,它允许我们在不修改代码的情况下,为程序添加额外的功能,如日志记录、事务管理、安全检查等。在Spring框架中,AOP通过代理模式实现,可以是JDK动态代理或CGLIB代理。 要实现自定义缓存,我们...
在实际应用中,自定义注解可以用于各种目的,如记录日志、数据验证、性能监控等。开发者可以根据需求定义注解,并编写相应的处理逻辑来实现功能。在Spring框架中,自定义注解被广泛用于依赖注入、AOP切面、数据绑定...
在Spring Boot应用中,Spring AOP(面向切面编程)是一种强大的工具,它允许我们创建横切关注点,如日志记录、权限检查等,这些关注点可以被编织到应用程序的多个点上,而无需侵入核心业务逻辑。在本案例中,我们将...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理等。在本主题中,我们将深入探讨Spring AOP的注解版,它是基于Java注解的...
在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许我们在不修改源代码的情况下,对程序进行横向关注点的插入,比如日志记录、事务管理、权限检查等。在这里,我们重点关注如何利用Spring AOP实现分层...
### Spring框架中的Annotation注解详解 #### 一、Spring与Annotation的基本概念 Spring框架通过引入Annotation,极大地简化了Java开发中的依赖注入(Dependency Injection, DI)和面向切面编程(AOP)的过程。...
SpringBoot AOP,即面向切面编程,是Spring框架中的一个重要特性,用于实现代码的横切关注点,如日志记录、事务管理、权限验证等。AOP通过使用代理模式,将这些关注点与核心业务逻辑分离,使得代码更加模块化,更...
总结来说,Spring自定义注解和AOP的结合使用,让我们能够灵活地在代码中插入跨切面的关注点,如日志记录、事务管理、性能监控等,而不必在每个方法中手动添加这些代码。这不仅提高了代码的整洁度,也使得系统更加...
下面我们将详细探讨如何利用Spring的注解AOP和反射来实现日志记录。 首先,我们需要理解Spring的AOP注解。最常用的两个注解是`@Aspect`和`@Pointcut`。`@Aspect`用于定义一个切面类,而`@Pointcut`则用来声明一个...
使用Spring Boot的AOP处理自定义注解 AOP(Aspect-Oriented Programming,面向切面编程)是一种程序设计范型,旨在解决横切关注点(crosscutting concern)的问题。Spring Boot提供了AOP的支持,使得开发者可以轻松...
**Spring AOP 注解例子详解** 在 Spring 框架中,面向切面编程(Aspect Oriented Programming,AOP)是一种强大的设计模式,它允许我们分离关注点,将业务逻辑与系统服务(如日志、事务管理等)解耦。在 Spring AOP...
本篇将深入探讨如何使用Spring AOP来记录操作日志,并通过自定义Aspect和注解实现这一功能。 首先,我们要理解Spring AOP的基本概念。AOP是面向对象编程(OOP)的一种补充,它专注于处理那些横向的、与业务逻辑无关...
在本资料"Spring_Annotation_AOP"中,我们将深入探讨Spring框架如何利用注解实现AOP,以及其背后的原理和实践应用。 面向切面编程(AOP)是一种编程范式,旨在提高代码的可维护性和可重用性,通过将关注点分离,...