@interface 自定义annotation 通过AOP来实现人员操作日志

本文介绍如何通过自定义注解结合AOP技术实现人员操作日志记录功能。具体步骤包括:定义Token注解;在目标方法应用注解;配置Spring AOP;创建切面类处理日志业务。

 @interface 自定义annotation 通过AOP来实现人员操作日志

首先 自定义annotation

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Token {


   //此处实例是用来做token验证的,要是日志处理的话  可以在多定义几个参数 
    boolean save() default false;  //定义了save参数
 
    boolean remove() default false;  //定义了remove参数


}



2、 在需要记录日志的方法上引入注解

@RequestMapping(value = { "/xxxxxxxx" }, produces = { "application/json;charset=UTF-8" })
@ResponseBody
@Token(remove=true)    
public String xxxxxxxxx(HttpServletRequest request,HttpServletResponse response, HttpSession session) throws IllegalAccessException, InvocationTargetException, IntrospectionException{


3、 在spring.xml配置文件中加上aop注解

 <context:component-scan base-package="com.xxxxx.web.common.aspect" />
aop注解
      <aop:aspectj-autoproxy proxy-target-class="true" /> 


4、在  com.xxxxx.web.common.aspect 包下 新建切面bean   TokenAspect


@Component
@Aspect
public class TokenAspect {

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

@Pointcut("execution(* com.fyyg.web..*(..))")
public void aspect(){ }


* 配置前置通知,使用在方法aspect()上注册的切入点
* 同时接受JoinPoint切入点对象,可以没有该参数
 
@Before("aspect()")
public void before(JoinPoint joinPoint) throws ClassNotFoundException {
if(log.isInfoEnabled()){
log.info("before " + joinPoint);
}
String targetName = joinPoint.getTarget().getClass().getName();  
       String methodName = joinPoint.getSignature().getName();  
       Object[] arguments = joinPoint.getArgs();  
       Class targetClass = Class.forName(targetName);  
       Method[] methods = targetClass.getMethods();  
       Token annotation=null;
        for (Method method : methods) {  
            if (method.getName().equals(methodName)) {  
               Class[] clazzs = method.getParameterTypes();  
                if (clazzs.length == arguments.length) {  

    //获取到自定义注解,且在这个可以获取到  当前类注解的参数值 。如上,则可获取到remove值为true
                annotation = method.getAnnotation(Token.class);
                  //在此处可以进行逻辑操作
                  
               }  
           }  
       }  
        //return description;  
}

}

<think>我们正在讨论自定义注解的用途和实现方式。根据引用内容,自定义注解主要用于实现AOP(面向切面编程),例如日志记录、性能监控、事务管理等。实现方式通常包括定义注解、在目标方法上使用注解、编写切面类来处理注解逻辑。 步骤分解: 1. 定义自定义注解:使用Java的元注解(如@Target, @Retention)来声明注解的作用范围和生命周期。 2. 在需要拦截的方法上添加自定义注解。 3. 编写切面类,使用AOP通知(如@Around, @Before等)来定义拦截后的处理逻辑,并通过切入点表达式指定拦截带有自定义注解的方法。 下面将详细说明每一步,并给出代码示例。</think>### 自定义注解的用途与实现方式 自定义注解在编程中主要用于**声明式标记**和**面向切面编程(AOP)**,通过元数据标注实现代码解耦和横切关注点管理。以下是核心实现步骤: --- #### **一、自定义注解的核心用途** 1. **AOP编程** 在方法上添加注解自动触发日志记录、性能监控等横切逻辑(如引用[1][4]所示)。 2. **配置标记** 替代XML配置,声明方法/类的特殊行为(如事务管理、权限控制)。 3. **元数据驱动** 通过反射读取注解信息实现动态处理(如引用[3]的反射示例)。 --- #### **二、实现步骤(以Spring Boot为例)** ##### 1. **定义注解** ```java @Target(ElementType.METHOD) // 注解作用在方法上 @Retention(RetentionPolicy.RUNTIME) // 运行时可通过反射读取 public @interface CustomLog { String value() default ""; // 可配置的注解参数 } ``` - **`@Target`**:指定注解作用目标(方法/类/字段等,见引用[5]的`ElementType`枚举) - **`@Retention`**:决定注解生命周期(`RUNTIME`为运行时保留) ##### 2. **在目标方法使用注解** ```java @CustomLog("用户查询操作") public User getUserById(Long id) { return userRepository.findById(id); } ``` ##### 3. **编写切面处理逻辑** ```java @Aspect @Component public class LogAspect { // 拦截带@CustomLog注解的方法 @Around("@annotation(customLog)") public Object logExecution(ProceedingJoinPoint pjp, CustomLog customLog) throws Throwable { String logMsg = customLog.value(); // 获取注解参数 System.out.println("[开始执行] " + logMsg); Object result = pjp.proceed(); // 执行原方法 System.out.println("[执行完成] " + logMsg); return result; } } ``` - **`@Around`**:最常用的通知类型,可控制方法执行前后逻辑(引用[1][4]) - **切入点表达式**:`@annotation(注解类名)`精确匹配注解 ##### 4. **启用AOP支持** 在Spring Boot启动类添加: ```java @EnableAspectJAutoProxy // 启用AOP代理 @SpringBootApplication public class Application { ... } ``` --- #### **三、关键注意事项** 1. **依赖引入** 需添加Spring AOP依赖(引用[4]): ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` 2. **注解参数** 可在注解中定义带默认值的参数(如`String reportName() default "";`,引用[2]),切面中动态获取。 3. **异常处理** 在通知方法中捕获异常实现错误日志(如引用[1]的`try-catch`块)。 > 实现效果:当调用`getUserById()`时,自动输出`[开始执行] 用户查询操作`和`[执行完成] 用户查询操作`日志[^1][^4]。 --- #### **四、典型应用场景** 1. **性能监控**:统计方法执行耗时(引用[2]的计时场景) 2. **操作审计**:记录关键业务操作日志 3. **权限校验**:通过注解拦截未授权调用 4. **事务管理**:声明式事务控制(如Spring的`@Transactional`) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值