闽公网安备 35020302035485号
3.自定义注解的原理
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 自定义注解
* @Target(ElementType.METHOD) 适用范围为方法
* @Retention(RetentionPolicy.RUNTIME) 运行时保留
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation {
String value() default "default value";
}
定义注解处理器import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
/**
* 自定义注解处理器
* 实现 BeanPostProcessor 接口,拦截 Bean 的初始化过程
*/
@Component
public class MyCustomAnnotationProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// 遍历 Bean 的所有方法
for (Method method : bean.getClass().getMethods()) {
// 如果方法上存在自定义注解
if (method.isAnnotationPresent(MyCustomAnnotation.class)) {
// 获取注解
MyCustomAnnotation annotation = method.getAnnotation(MyCustomAnnotation.class);
// 打印注解信息
System.out.println("Found method: " + method.getName() + " with annotation value: " + annotation.value());
}
}
return bean;
}
}
使用自定义注解import org.springframework.stereotype.Service;
/**
* 使用自定义注解的服务类
*/
@Service
public class MyService {
@MyCustomAnnotation(value = "custom value")
public void myMethod() {
// 业务逻辑
System.out.println("Executing myMethod...");
}
}
四.自定义注解的应用场景import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
}
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LogExecutionTimeAspect {
@Before("@annotation(LogExecutionTime)")
public void logExecutionTime() {
System.out.println("Method execution started...");
}
}
权限控制import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequirePermission {
String value();
}
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class PermissionAspect {
@Before("@annotation(requirePermission)")
public void checkPermission(RequirePermission requirePermission) {
String permission = requirePermission.value();
// 权限检查逻辑
System.out.println("Checking permission: " + permission);
}
}
参数校验import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidParam {
String message() default "Invalid parameter";
}
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class ValidParamAspect {
@Around("@annotation(validParam)")
public Object validateParam(ProceedingJoinPoint joinPoint, ValidParam validParam) throws Throwable {
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Object[] args = joinPoint.getArgs();
// 堆代码 duidaima.com
// 参数校验逻辑
for (Object arg : args) {
if (arg == null) {
throw new IllegalArgumentException(validParam.message());
}
}
return joinPoint.proceed();
}
}
五.最佳实践可维护性与扩展性:设计灵活、可扩展的处理器