我试图创建一个简单的spring应用程序,但是当我使用@Component注释来代替bean而不是在spring.xml文件中定义它时,我收到了这个错误。
2017年8月9日上午11:06:03 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 信息:刷新org.springframework.context.support.ClassPathXmlApplicationContext@7e32c033:启动日期[Wed Aug 09 11:06:03 IST 2017];上下文层次结构的根 2017年8月9日上午11:06:03 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息:从类路径资源[spring.xml]加载XML bean定义 线程" main"中的例外情况org.springframework.beans.factory.NoSuchBeanDefinitionException:没有名为' oval'可得到 在org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:687) 在org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1207) 在org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:284) 在org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 在org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1078) 在org.sumit.javabrains.DrawingApp.main(DrawingApp.java:24)
我的课程如下: 1. DrawingApp.java(主类)
public package org.sumit.javabrains;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class DrawingApp {
public static void main(String[] args) throws InterruptedException {
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
Oval oval = (Oval) context.getBean("oval");
oval.draw();
}
}
2。 Spring.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-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:component-scan base-package="com.sumit.javabrains" />
<context:annotation-config />
<bean id="focus" class="org.sumit.javabrains.Point" scope="singleton">
<property name="x" value="-7" />
<property name="y" value="8" />
</bean>
</beans>
3 Point.java
package org.sumit.javabrains;
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;
}
}
4 Oval.java
package org.sumit.javabrains;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
@Component
public class Oval {
private Point focus;
public Point getFocus() {
return focus;
}
@Resource
public void setFocus(Point focus) {
this.focus = focus;
}
public void draw() {
System.out.println("Point focus is: ("+focus.getX()+", "+focus.getY()+")");
}
}
是否有人能够帮助解决导致此问题的原因。我使用spring 4.3.10 RELEASE
答案 0 :(得分:5)
那是因为您的组件扫描正在扫描错误的包
<context:component-scan base-package="com.sumit.javabrains" />
- 错误
应扫描如下:
<context:component-scan base-package="org.sumit.javabrains" />
- 更正
答案 1 :(得分:2)
您必须在spring.xml中定义所有bean。在这种情况下,您错过了Spring配置文件中的Oval类。在Spring.xml文件中将Oval类定义为bean。 要么 编辑组件扫描标记并放入正确的包。
答案 2 :(得分:1)
这里出了两件事。 1.您在xml文件中提到错误的基本包
com.sumit.javabrains必须替换为org.sumit.javabrains
答案 3 :(得分:0)
尝试在@ComponentScan
类的顶部使用@Component
代替Oval
。
答案 4 :(得分:0)
我没有使用spring.xml文件(只是默认的spring boot配置),我的@SpringBootApplication注释类比我的@Component类深一个包级别,这使得未选择@Component类向上。
例如:
com.company.base/ComponentAnnotatedClass.java
com.company.base.application/MySpringBootApplication.java