java - 实现 spring 自定义注解就像@Transactional
问题描述
我想实现一些常见的注释行为,比如@Transactional
注释。
在挖掘了spring核心代码并进行了一些谷歌搜索之后,我了解到如果我将@Transactional
注释放在一个方法上,那么该方法就会被代理包装。但是,我仍然不知道如何自己实现类似的东西。
有没有这方面的详细指南?
解决方案
注解是 Java EE 特性,并不特定于 Spring。假设您要实现一个名为 @CourseCode 的自定义注释,它验证课程代码是否以(默认值)“ABC”开头。您可能还希望覆盖要验证的默认值,例如“XYZ”。
您需要为 CourseCode 定义“@interface”并为其实现 ConstraintValidator。
这是一个例子:
典型用法
@CourseCode(value="XYZ", message="must start with XYZ") // value and message are optional
private String courseCode;
@CourseCode 实施
package my.package.springdemo.mvc.validation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Constraint(validatedBy = CourseCodeConstraintValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CourseCode {
// Define default course code
public String value() default "ABC";
// Define default error message
public String message() default "must start with ABC";
// Define default groups
public Class<?>[] groups() default {};
// Define default payloads
public Class<? extends Payload>[] payload() default {};
}
这是 ConstraintValidator 的实现:
package my.package.springdemo.mvc.validation;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class CourseCodeConstraintValidator implements ConstraintValidator<CourseCode, String> {
private String coursePrefix;
@Override
public void initialize(CourseCode theCourseCode) {
coursePrefix = theCourseCode.value();
}
@Override
public boolean isValid(String theCode, ConstraintValidatorContext theConstraintValidatorContext) {
boolean result;
if (theCode != null) {
result = theCode.startsWith(coursePrefix);
}
else {
result = true;
}
return result;
}
}
推荐阅读
- c - 包装一个函数
- css - 另一个转换元素中的 Css 转换
- django - 我是否应该在两个相关模型中重复字段
- python - 如何制作多个移动点的动画?
- r - 在 data.frame 中带有符号的 OHCL 数据,需要通过符号 (R) 提取唯一关闭数
- docker - 将 Container 连接到网络中的外部计算机
- express - Mongoose 防止字段被大量分配
- amazon-web-services - 如果我在没有 MaxResults 的情况下调用 EC2 客户端的“describe_instances”函数,它会返回所有实例吗?
- vb.net - 当从文本框字符串“单击”vb表单按钮时如何执行命令,然后在richtextbox中显示输出
- visual-studio-2017 - 为什么 Windows 10 升级使用 IIS Express 破坏了 VS 2017?