Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实现spring自定义注释的作用类似于@Transactional_Java_Spring - Fatal编程技术网

Java 实现spring自定义注释的作用类似于@Transactional

Java 实现spring自定义注释的作用类似于@Transactional,java,spring,Java,Spring,我想实现一些常见的注释行为,比如@Transactional annotation 在挖掘了spring核心代码并进行了一些谷歌搜索之后,我了解到,如果我将@Transactional注释放在一个方法中,那么该方法就会被代理包装起来。但是,我仍然不知道如何独自实现这样的事情 有详细的指南吗?注释是JavaEE特性,不是Spring特有的。假设您想要实现一个名为@CourseCode的自定义注释,该注释验证课程代码是否以默认值“ABC”开头。您可能还希望覆盖要验证的默认值,例如“XYZ” 您需要为

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

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


有详细的指南吗?

注释是JavaEE特性,不是Spring特有的。假设您想要实现一个名为@CourseCode的自定义注释,该注释验证课程代码是否以默认值“ABC”开头。您可能还希望覆盖要验证的默认值,例如“XYZ”

您需要为CourseCode定义@interface并为其实现ConstraintValidator

以下是一个例子:

典型用法

    @CourseCode(value="XYZ", message="must start with XYZ") // value and message are optional
    private String 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;
    }
}


谢谢你的回答和时间,但我知道注释是java的东西。我的问题的重点是如何使用注释实现方法代理。很抱歉误解了这个问题。这有帮助吗?前一个依赖于Spring AOP。如果需要Spring AOP独立注释,那么AspectJ就是前进的方向。这里有一个例子:我将看看它们。感谢您的关注:还有一个来自Spring4文档的Spring+AspectJ:令人惊讶的是,我没有在Spring5中找到参考!