Ich habe gelesen, dass @Required verwendet, um sicherzustellen, dass die Eigenschaft festgelegt wurde. Aber wenn ich versuche, es zusammen mit der Spring Annotation-Konfiguration zu verwenden, funktioniert es nicht.

Unten können Sie sich mit meiner Codebasis vertraut machen.

@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);

    }

}

Warum erstellt der Spring-Anwendungskontext die SimpleClass Bean und beschwert sich nicht über das Fehlen einer Injektion über den Setter?

UPD: Wenn ich versuche, dasselbe mithilfe der XML-Konfiguration zu tun und hinzuzufügen, erhalte ich eine "Ausnahme im Thread" main "org.springframework.beans.factory.BeanCreationException: Die Eigenschaft 'n' ist für die Bean 'simple' erforderlich."

2
Pasha 30 Juni 2018 im 17:04

3 Antworten

Beste Antwort

{{X0} } Dokumentationszustände (Schwerpunkt liegt bei mir):

Markiert eine Methode (normalerweise eine JavaBean-Setter-Methode) als 'erforderlich': Das heißt, die Setter-Methode muss so konfiguriert sein Abhängigkeit mit einem Wert injiziert.

Mit Spring müssen Sie eine Methode angeben, um sie als injizierte Abhängigkeit zu konfigurieren (@Autowired ist die Standardmethode).

Die Angabe von @Autowired und @Required für eine Methode erscheint heute jedoch umständlich:

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

Um den Setter so zu konfigurieren, dass er sowohl abhängig als auch erforderlich ist, empfehle ich stattdessen, nur @Autowired zu verwenden, das standardmäßig erforderlich ist, wie Sie feststellen können:

public @interface Autowired {

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

}

Es reicht also:

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

Als Randnotiz wird die Setter-Injektion wahrscheinlich fehlschlagen, da int n wahrscheinlich nicht als Abhängigkeit aufgelöst wird. Die Anmerkung @Value zum Parameter könnte Ihnen wahrscheinlich helfen.

2
davidxxx 30 Juni 2018 im 15:23

Sie müssen es zusammen mit der Annotation @Autowired (oder @Value, wenn Sie einfache Werte einfügen) verwenden.

2
fg78nc 30 Juni 2018 im 15:02

Verweis auf diesen Artikel:

Ohne eine RequiredAnnotationBeanPostProcessor Bohne wird sich Spring nicht beschweren.

Also ... füge eine weitere Bean vom Typ RequiredAnnotationBeanPostProcessor hinzu (mit @Autowired), damit sie sich beschwert.

Außerdem soll die Annotation @Required für den Bean-Setter verwendet werden. Sie versuchen, @Required einen primitiven Typ zu überprüfen. Soweit ich weiß, sollen alle Spring Beans (oder J2EE Beans) Objekte sein.

Für primitive Typen können Sie eine @Value -Injektion verwenden.

0
M. Deinum 3 Juli 2018 im 07:58