2016-07-25 14 views
0

Ich versuche, meine Circle-Klasse automatisch zu verdrahten. Ich verwende ein Qualifikationsmerkmal, damit Spring zwischen den beiden Point-Klassen-Beans unterscheiden kann, die ich als Qualifier definiert habe.Auto-Verkabelung mit Qualifier Annotation

public class Circle{ 
    private Point center; 

    @Autowired 
    @Qualifier("circleRelated") 
    public void setCenter(Point center) { 
     this.center = center; 
    } 

    public void draw() { 
     System.out.println("Drawing Circle"); 
     System.out.println("Centre point is " + center.getX()); 
    } 
} 

Die Point-Klasse ist als

public class Point { 
    private int x; 
    public int getX() { return x; } 

    public void setX(int x) { this.x = x;} 
} 
folgt

Die beans.xml ist

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <bean id="circle" class="com.example.Circle"/> 

    <bean id="pointA" class="com.example.Point"> 
    <qualifier value="circleRelated" /> 
    <property name="x" value="0"/> 
    <property name="y" value="0"/> 
    </bean> 

    <bean id="pointB" class="com.example.Point"> 
    <property name="x" value="-20"/> 
    <property name="y" value="0"/> 
    </bean> 

    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> 

</beans> 

Meine Hauptklasse ist

import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

@SpringBootApplication 
public class AutowiredAnnotationApplication { 

    public static void main(String[] args) { 
     ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 

     Circle circle = (Circle) context.getBean("circle"); 
     circle.draw(); 
    } 
} 

Der Fehler I erhalten

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.example.Point] is defined: expected single matching bean but found 2: pointA,pointB 

Warum kann die Quelle die Bean nicht mit dem angegebenen Qualifier automatisch ansteuern?

+0

Ich habe absichtlich nicht verwendet –

Antwort

0

Die @Qualifier erhält die Bean-ID als Wert. Sie müssen also „pointA“ oder „pointB“

public class Circle{ 
    private Point center; 

    @Autowired 
    @Qualifier("pointA") 
    public void setCenter(Point center) { 
     this.center = center; 
    } 

    public void draw() { 
     System.out.println("Drawing Circle"); 
     System.out.println("Centre point is " + center.getX()); 
    } 
} 

Im Allgemeinen verwenden, wenn Sie die @Qualifier überspringen - Sie nach Typ autowire. Das bedeutet: "Suche im Spring-Kontext eine Bean dieses Typs und wirf eine Exception aus, wenn keine oder mehr als eine gefunden wird".

Wenn fügen Sie den @Qualifier („somename“), die bedeutet - „im Frühjahr Kontext dieser Art eine Bohne suchen und mit diesem Namen und eine Ausnahme auslösen, wenn keine gefunden wird“

Edit: Werfen Sie einen Blick auf this. Ich glaube nicht, dass Sie Tags brauchen.

Wenn Sie eine Bean mit @Autowired injizieren möchten, benötigt die @Qualifier die Bean-ID als Wert. Zum Beispiel benötigt @Qualifier("pointA") eine Bean mit der ID: pointA.

Wenn Sie die Bean nur mit XML injizieren möchten, können Sie ref verwenden. Sie brauchen dafür keinen Qualifier, nur für das Autowire.

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <bean id="circle" class="com.example.Circle"> 
     <property name="center" ref="pointA"/> 
    </bean> 

    <bean id="pointA" class="com.example.Point"> 
    <qualifier value="circleRelated" /> 
    <property name="x" value="0"/> 
    <property name="y" value="0"/> 
    </bean> 

    <bean id="pointB" class="com.example.Point"> 
    <property name="x" value="-20"/> 
    <property name="y" value="0"/> 
    </bean> 

</beans> 

Edit 2: Siehe this. Ich glaube, dass das Qualifier-Tag nur berücksichtigt wird, wenn Sie die Bean-ID überspringen, andernfalls wird die Bean-ID verwendet.

+0

Danke. Was ändere ich, damit es mit dem '' tag funktioniert –

+0

@PranavKapoor Siehe meine Bearbeitung. –

+0

Sie sind richtig, dass ich hier kein Qualifier-Tag brauche. Aber was für einen Anwendungsfall hat es überhaupt? –

0

Sie haben diese Zeile aus Ihrem beans.xml zu entfernen:

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> 

Aus irgendeinem Grunde, es mit Ihrer ansonsten korrekten Konfiguration ist einzumischen.