【问题标题】:What is the method signature means? String value() default "";方法签名是什么意思?字符串值()默认“”;
【发布时间】:2019-01-21 07:15:44
【问题描述】:

我在 Spring Component 接口中遇到了这个方法签名。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component 
{
   String value() default "";
}

方法签名String value() default "";是什么意思? 我们应该如何以及何时为我们的编码目的定义这样的语法?

【问题讨论】:

  • 直截了当。它是 Spring 组件名称。如果用户不提供名称,则默认为“”。它主要用于您要命名 bean 时。例如。 Animal 类有 2 个实例,所以我不能直接自动装配它们,因此我需要命名它们,然后使用命名 bean 自动装配。
  • @SagarGandhi 因此,如果我的理解是正确的,您指的是使用 Qualifier 标签,然后使用限定名称值自动装配实例。例如,我有两个实例 Tiger 和 Lion,并且我在组件级别使用限定符(“tiger”)和(“Lion”),然后我可以通过给出它们的限定名称(如 Lion 和 Tiger)来自动连接它们。我说的对吗?
  • 是的,没错。基本上,有了它,您可以为实例命名。

标签: java spring-boot syntax annotations


【解决方案1】:

这不是方法签名。这意味着您可以将 String 作为参数传递给 Component 注释,如下所示:

@Component(value = "value")

如果您不指定自己的值,将使用默认值 ""。

如果是这样的话:

String value(); // without the default

value 本来是一个强制参数。尝试像这样使用组件:

@Component()

会导致异常,因为您没有提供值。

编辑:何时使用。

如果您不太了解此语法或一般注释,则不应使用它们。关于可以使用注释完成的所有事情,尤其是定制的,也可以在没有注释的情况下完成。

假设您要创建一个注释来验证字段的值。 我将使用比利时邮政编码的示例。它们都是 4 位数字,介于 1000 和 9999 之间。

@Target( {ElementType.FIELD})
@Retention( RetentionPolicy.RUNTIME)
@Constraint( validatedBy = ValidatePostalCodeImpl.class)
public @interface ValidatePostalCode{
  String message() default "You have entered an invalid postal code";
  Class<?>[] groups() default {}; // needed for the validation
  Class<? extends Payload>[] payload() default{}; // needed for the validation

  int maxValue() default 9999; // so, by default, this will validate based
  int minValue() default 1000; // on these values, but you will be able to 
  // override these
}

/* 验证实现 */

public class ValidatePostalCodeImpl implements ConstraintValidator<ValidatePostalCode, Integer> {

    int upperValue;
    int lowerValue;

    @Override
    public void initialize(ValidatePostalCode validate) {
        this.upperValue = validate.maxValue(); // here you call them as if they indeed were regular methods
        this.lowerValue = validate.minValue();
    }

    @Override
    public boolean isValid(Integer integer, ConstraintValidatorContext context) {
        return integer >= lowerValue && integer <= upperValue;
    }

}

/* 用法 */

@Entity
@Table(name = "addresses")
public class Addresses {

  // home address -> In Belgium, so has to be between the default values:
  @ValidatePostalCode
  Integer belgianPostalCode;

  // vacation home in another country, let's say the PC's there are between
  // 12000 and 50000
  @ValidatePostalCode(minValue = 12000, maxValue = 50000)
  Integer foreignPostalCode;

}

当然,这是一个非常有限的例子,但它应该让你有个想法。

【讨论】:

  • 谢谢@Stultuske 的回答。但是我的第二个问题仍然存在。在我的编码中应该使用上述语法的情况是什么?你能解释一下吗?
  • 我会在我的回答中添加一个例子
  • 这将非常有帮助...非常感谢您的宝贵时间
  • 感谢@Stultuske 提供的示例。我现在对这个问题 100% 清楚。感谢您的宝贵时间。
【解决方案2】:

@interface 关键字用于定义注解。此注解有一个名为value 的属性,您可以显式指定它:

@Component(value = "myValue")

或者简写形式:

@Component("myValue")

如果您不指定value,它将默认为"",由default 关键字定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 2020-08-13
    • 1970-01-01
    相关资源
    最近更新 更多