我正在尝试自动连接我的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?
答案 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
。
如果您只想使用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"/>
出于某种原因,它正在干涉您正确的配置。