首页 > 解决方案 > 实现 spring 自定义注解就像@Transactional

问题描述

我想实现一些常见的注释行为,比如@Transactional注释。

在挖掘了spring核心代码并进行了一些谷歌搜索之后,我了解到如果我将@Transactional注释放在一个方法上,那么该方法就会被代理包装。但是,我仍然不知道如何自己实现类似的东西。

有没有这方面的详细指南?

标签: javaspring

解决方案


注解是 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;
    }
}


推荐阅读