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(); } }五.最佳实践
可维护性与扩展性:设计灵活、可扩展的处理器