Почему @Required игнорируется Spring? - PullRequest
0 голосов
/ 30 июня 2018

Я читал, что @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 создает bean-компонент SimpleClass и не жалуется на отсутствие внедрения через сеттер?

UPD: Когда я пытаюсь сделать то же самое с использованием конфигурации XML и добавить, то я получаю «Исключение в потоке» main »org.springframework.beans.factory.BeanCreationException: свойство 'n' требуется для bean 'simple' '

Ответы [ 3 ]

0 голосов
/ 30 июня 2018

@Required Состояния документации (выделено мое):

Помечает метод (как правило, метод установки JavaBean) как 'required': то есть метод установки должен быть настроен так, чтобы вводится зависимость со значением.

В 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;
}

В качестве дополнительного примечания, внедрение сеттера, вероятно, завершится неудачей, поскольку int n, вероятно, не будет разрешено как зависимость. @Value примечание к параметру, вероятно, может помочь вам.

0 голосов
/ 30 июня 2018

Ссылаясь на эту статью :

Без боба RequiredAnnotationBeanPostProcessor Spring не будет жаловаться.

Итак ... добавьте еще один компонент типа RequiredAnnotationBeanPostProcessor (используя @Autowired), чтобы он жаловался.

Кроме того, аннотацию @Required следует использовать для установщика Бина. Вы пытаетесь выполнить @Required проверку типа примитива. Насколько я понимаю, все Spring Bean (или bean-компоненты J2EE) должны быть объектами.

Для примитивных типов вы можете использовать @Value инъекцию.

0 голосов
/ 30 июня 2018

Вам необходимо использовать его вместе с аннотацией @Autowired (или @Value, если вы вводите простые значения).

...