@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
Point
和 beans.xml
中的相同 bean
@ComponentScan(basePackages="com.example.demo")
在 Circle
上:这没有意义...
ApplicationContext context = new ClassPathXmlApplicationContext ("beans.xml")
而 SpringApplication.run(...)
returns 一个 ApplicationContext
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
并且只是 @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
Point
和beans.xml
中的相同 bean
@ComponentScan(basePackages="com.example.demo")
在Circle
上:这没有意义...ApplicationContext context = new ClassPathXmlApplicationContext ("beans.xml")
而SpringApplication.run(...)
returns 一个ApplicationContext