使用限定符注释进行自动连线

时间:2016-07-25 11:21:02

标签: spring

我正在尝试自动连接我的Circle类。我正在使用限定符,以便Spring能够区分我创建了限定符的两个Point类bean。

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());
   }
}

Point类如下

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

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

beans.xml是

<?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>

我的主要课程是

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();
   }
}

我得到的错误是

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

为什么spring无法使用给定的限定符自动装配bean?

2 个答案:

答案 0 :(得分:0)

@Qualifier将bean id作为值。所以你必须使用“pointA”或“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());
   }
}

通常,如果您跳过@Qualifier,则按类型自动装配。这意味着“在Spring上下文中搜索该类型的bean,如果找不到或者多于一个,则抛出异常”。

如果添加@Qualifier(“someName”)意味着 - “在Spring上下文中搜索该类型的bean并使用该名称,如果没有找到则抛出异常”

修改 看看this。我认为你根本不需要标签。

如果你不想使用@Autowired注入一些bean,@Qualifier需要bean id作为它的值。例如,@Qualifier("pointA")将需要一个ID为pointA

的bean

如果您只想使用xml注入bean,可以使用ref。您不需要限定符,仅用于自动装配。

<?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>

编辑2:this。我相信只有当你跳过bean id时才会考虑限定符标记,否则会使用bean id。

答案 1 :(得分:0)

您必须从beans.xml中删除此行:

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

出于某种原因,它正在干涉您正确的配置。