注解传参
注解传参是指在使用 Java 注解时,可以通过在注解中定义参数,然后在使用该注解时传入相应的参数值。这种方式可以方便地对注解进行配置和定制,使得注解具有更加灵活和可配置的特性。在 Java 中,可以通过在注解定义时使用 @interface 关键字来定义一个注解,并在注解中定义参数。例如:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnnotation {
String value() default "default value";
}
上述代码定义了一个名为 MyAnnotation 的注解,并在其中定义了一个 value 参数,该参数默认值为 "default value"。在使用该注解时,可以通过传入不同的参数值来对注解进行配置。例如:
@MyAnnotation(value = "custom value")
public class MyClass {
}
上述代码使用了 MyAnnotation 注解,并传入了一个名为 value 的参数,参数值为 "custom value"。
spring aop 注解传参
如何在 Spring AOP 中使用注解传递参数
为了实现在 Spring AOP 中通过注解传递参数,通常会结合自定义注解和切面编程来达到目的。下面是一个详细的例子展示如何创建并应用这样的功能。
创建自定义注解
首先,在项目中定义一个新的注解 CheckParam
来标记需要验证的方法参数:
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 CheckParam {
String value();
}
此部分描述了如何构建一个简单的自定义注解用于后续操作[^1]。
编写 Aspect 切片类
接着编写一个切面类 ParameterValidationAspect
实现具体的拦截逻辑:
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class ParameterValidationAspect {
@Around("@annotation(checkParam)")
public Object validateParameters(ProceedingJoinPoint joinPoint, CheckParam checkParam) throws Throwable {
// 获取方法参数名及其对应的值
Object[] args = joinPoint.getArgs();
for (Object arg : args) {
if(arg instanceof String && ((String)arg).isEmpty()){
throw new IllegalArgumentException("Invalid argument: " + checkParam.value());
}
}
return joinPoint.proceed(args);
}
}
上述代码展示了如何设置环绕通知(@Around
)以及获取目标方法的实际参数列表,并对其进行简单有效性检查[^4]。
应用到 Controller 方法上
最后可以在控制器层面上的应用场景如下所示:
@RestController
@RequestMapping("/api")
public class MyController {
@PostMapping("/example")
public ResponseEntity<String> example(@RequestParam(value="name", required=false)
@CheckParam("Name cannot be empty") String name){
return ResponseEntity.ok("Hello "+name);
}
}
这里将之前定义好的 CheckParam
注解放置到了请求映射函数的参数位置处,当接收到 HTTP 请求时就会触发相应的前置处理流程。
添加必要的 Maven 依赖项
确保项目的 pom.xml
文件里包含了正确的 Spring AOP 和其他所需库的支持:
<dependencies>
<!-- Spring AOP dependency -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.10</version>
</dependency>
<!-- Other dependencies as needed... -->
</dependencies>
这一步骤保证了应用程序能够正确加载所需的框架组件以支持AOP特性[^2]。
spring boot自定义注解 传参接参
创建和使用带参数的自定义注解
在Spring Boot中创建并使用带有参数的自定义注解涉及几个关键步骤。这些步骤包括定义注解、配置组件扫描以及利用AOP或其他方式处理注解逻辑。
定义自定义注解
首先,需要定义一个新的注解类,并指定其元数据属性。这可以通过@interface
关键字完成。为了使该注解能够携带参数,可以在定义时声明相应的成员变量。下面展示了一个简单的例子:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// 设置注解的作用范围为目标方法或字段级别
@Target({ ElementType.METHOD, ElementType.FIELD })
// 设定注解保留策略为运行时可见
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
// 注解可以接受字符串类型的参数,默认为空串
String value() default "";
}
此部分展示了如何定义一个名为CustomAnnotation
的简单注解,它可以应用于方法或字段上,并允许传入一个可选的字符串参数[^1]。
处理自定义注解
一旦定义好了注解,下一步就是决定在哪里以及怎样去读取这个注解的信息。对于大多数场景来说,最常用的方法之一是借助于面向切面编程(AOP),即通过编写AspectJ风格的切面来拦截被标记了特定注解的目标对象/行为。
这里给出一段基于AOP实现的例子,用于捕获任何带有上述自定义注解的方法调用,并打印出所附带的消息内容:
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class AnnotationProcessor {
@Before("@annotation(customAnnotation)")
public void process(JoinPoint joinPoint, CustomAnnotation customAnnotation){
System.out.println("Intercepted method call with message: "
+ customAnnotation.value());
}
}
这段代码实现了对所有标注有CustomAnnotation
的地方进行前置增强(@Before
)的功能,每当匹配到这样的地方就会触发相应的行为——在这里是指向控制台输出一条信息[^2]。
应用实例
最后一步是在实际业务逻辑里运用之前准备好的工具。比如在一个控制器(Controller)内部添加这样一个注解,并为其提供具体的参数值:
@RestController
@RequestMapping("/example")
public class ExampleController {
@CustomAnnotation(value="This is a test.")
@GetMapping("/test")
public ResponseEntity<String> getTest(){
return new ResponseEntity<>("Success", HttpStatus.OK);
}
}
当访问路径 /example/test
时,除了正常的HTTP响应外,还会看到由前面提到的那个方面程序产生的额外日志条目,显示了来自注解内的消息文本[^4]。
相关推荐















