@Component 和@Autowired 不解析依赖bean

@Component and @Autowired not resolving the dependent bean

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"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-3.0.xsd"
            >
            
    
        <!-- bean definitions here --> 
        
        <bean id="point" class="com.example.demo.Point">
            <qualifier value="circleRelated" />
            <property name="x" value="0"></property>
            <property name="y" value="0"></property>
        </bean>
        
        <context:annotation-config/>
        
        <context:component-scan base-package="com.example.demo" /> 

Class 主要方法:

package com.example.demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    @SpringBootApplication
    public class SpringSecondApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringSecondApplication.class, args);
            
            ApplicationContext context = new ClassPathXmlApplicationContext ("beans.xml");
            
            Shape shape = (Shape) context.getBean("circle");
            shape.draw();
    
        }
    
    }

Circle.java

package com.example.demo;



import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

@Component
@ComponentScan(basePackages="com.example.demo")
public class Circle implements Shape {
    
    @Autowired
    @Qualifier("circleRelated")
    private Point point;

    public Circle(Point point) {
        super();
        this.point = point;
    }


    public Point getPoint() {
        return point;
    }


    public void setPoint(Point point) {
        this.point = point;
    }


    public void draw() {
        System.out.println("Draw is called");
        System.out.println("center.x:" + point.getX());
        System.out.println("center.y:" + point.getY());
    }

}

Point.java

package com.example.demo;

import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

@Component
public class Point {

    private int x;
    private int y;
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    
    
}

Shape.java

package com.example.demo;

public interface Shape {
    
    public void draw();

}

报错如下:

上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为 'circle' 的 bean 时出错:通过字段 'point' 表达的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有可用类型 'com.example.demo.Point' 的符合条件的 bean:预计至少有 1 个符合自动装配候选条件的 bean。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=circleRelated)} [2m2021-03-28 12:17:31.958[0;39m [32m INFO[0;39m [35m2747[0;39m [2m---[0;39m [2m[ main][0;39m [36mConditionEvaluationReportLoggingListener [0;39m [2m:[0;39m

启动 ApplicationContext 时出错。要显示条件报告,请重新 运行 您的应用程序并启用 'debug'。 [2m2021-03-28 12:17:31.977[0;39m [31mERROR[0;39m [35m2747[0;39m [2m---[0;39m [2m[ main][0;39m [36mo.s.b.d.LoggingFailureAnalysisReporter [0;39米[2米:[0;39米


应用程序启动失败


描述:

com.example.demo.Circle 中的字段点需要找不到类型 'com.example.demo.Point' 的 bean。

注入点有如下注解: - @org.springframework.beans.factory.annotation.Autowired(必填=真) - @org.springframework.beans.factory.annotation.Qualifier(value=circleRelated)

已找到以下候选人但无法注入: - 用户定义的 bean

操作:

考虑重新访问上面的条目或在您的配置中定义类型为 'com.example.demo.Point' 的 bean。

您可以通过 @ImportResource

导入您的 xml-beans

并且只是 @Autowire applicationContext 或通过 EventListener.

访问它

这是应用程序准备就绪时绘制圆圈的示例(ApplicationReadyEvent)

@SpringBootApplication
@ImportResource("classpath:beans.xml")
public class SpringSecondApplication {
    
   public static void main(String[] args) {
      SpringApplication.run(SpringSecondApplication.class, args);
   }

   @EventListener
   public void init(ApplicationReadyEvent event){
      Shape shape = (Shape) event.getApplicationContext().getBean("circle");
      shape.draw();
   }


编辑:查看了我的回答

@ImportResource("classpath:beans.xml") 不是严格需要的,但为了清楚起见建议使用它。 (beans.xml 将被自动检测)

如果你想在 main 方法中获取一个 bean(这里 circle )你可以,但在这里我还是不推荐它。

这应该有效:

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(DemoApplication.class, args);

        Shape shape = (Shape) context.getBean("circle");
        shape.draw();
    }
}

您的代码中存在冲突或可能导致冲突的内容:

  • @Component Pointbeans.xml
  • 中的相同 bean
  • @ComponentScan(basePackages="com.example.demo")Circle 上:这没有意义...
  • ApplicationContext context = new ClassPathXmlApplicationContext ("beans.xml")SpringApplication.run(...) returns 一个 ApplicationContext