为什么@Required 被Spring 忽略了?

Why is @Required ignored by Spring?

我读到 @Required 用于确保 属性 已设置。 但是当我尝试将它与 Spring 注释配置一起使用时,它不起作用。

下面你可以熟悉我的代码库。

@Configuration
@ComponentScan
public class AppConfig {

    @Bean(initMethod = "initMethod")
    public SimpleClass simpleClass(){
        return new SimpleClass();
    }

}

public class SimpleClass implements InitializingBean {

    private int n;

    public SimpleClass() {
        System.out.println("constructor");
    }

    public int getN() {
        return n;
    }

    @Required
    public void setN(int n) {
        System.out.println("setter");
        this.n = n;
    }

    void initMethod(){

    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet()");
    }

}

public class Main {

    public static void main(String[] args) {

        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        SimpleClass simpleClass = context.getBean(SimpleClass.class);

    }

}

为什么Spring application context 创建SimpleClass Bean 并且不抱怨没有通过setter 注入?

更新: 当我尝试使用 XML 配置执行相同操作并添加时,我收到一个 "Exception in thread "main" org.springframework.beans.factory.BeanCreationException: 属性 'n' is required for bean 'simple'"

您需要将它与@Autowired(或@Value,如果您注入简单值)注释一起使用。

@Required 文档状态(重点是我的):

Marks a method (typically a JavaBean setter method) as being 'required': that is, the setter method must be configured to be dependency-injected with a value.

使用 Spring 为了将方法配置为依赖注入,您必须指定它(@Autowired 是标准方式)。

但是在今天看来,在方法上同时指定 @Autowired@Required 似乎很笨拙:

@Autowired
@Required
public void setN(int n) {
    System.out.println("setter");
    this.n = n;
}

相反,要将 setter 配置为依赖注入和必需,我建议仅使用默认情况下需要的 @Autowired,如您所见:

public @interface Autowired {

    /**
     * Declares whether the annotated dependency is required.
     * <p>Defaults to {@code true}.
     */
    boolean required() default true;

}

所以足够了:

@Autowired    
public void setN(int n) {
    System.out.println("setter");
    this.n = n;
}

作为旁注,setter 注入可能会失败,因为 int n 可能不会作为依赖项解析。参数上的 @Value 注释可能会对您有所帮助。

指的是这个article

没有 RequiredAnnotationBeanPostProcessor bean,Spring 不会抱怨。

所以...添加另一个 RequiredAnnotationBeanPostProcessor 类型的 bean(使用 @Autowired)使其抱怨。

此外,@Required 注释将用于 Bean setter。您正在尝试对原始类型进行 @Required 检查。据我了解,所有 Spring Beans(或 J2EE beans)都是对象。

对于原始类型,您可以使用 @Value 注入。