为什么@Required被Spring忽略?

时间:2018-06-30 14:04:23

标签: java spring spring-annotations

我已阅读@Required用于确保已设置属性。 但是,当我尝试将其与Spring Annotation Configuration一起使用时,它将无法正常工作。

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

@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应用程序上下文会创建SimpleClass Bean,而不抱怨没有通过setter进行注入?

UPD: 当我尝试使用XML配置进行相同的操作并添加时,然后收到“线程“主”中的异常” org.springframework.beans.factory.BeanCreationException:bean“简单”需要属性“ n””

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

@Required文档说明(强调是我的):

  

将方法(通常是JavaBean setter方法)标记为   'required':即, setter方法必须配置为   依赖项注入了一个值。

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

但是在方法上同时指定@Autowired@Required似乎很笨拙:

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

相反,要将配置器配置为依赖项注入和必需注入,我建议仅使用@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注释可能会对您有所帮助。

答案 2 :(得分:0)

请参考此article

没有RequiredAnnotationBeanPostProcessor bean,Spring不会抱怨。

因此,...添加另一个RequiredAnnotationBeanPostProcessor类型的bean(使用@Autowired)使其投诉。

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

对于基本类型,可以使用@Value注入。