使用@Component for bean抛出错误。 NoSuchBeanDefinitionException

时间:2017-08-09 05:54:38

标签: spring

我试图创建一个简单的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

5 个答案:

答案 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

  1. 将@Resource替换为@Resource @Qualifier(&#34;焦点&#34;)。默认情况下,标有'@Component'的bean将与该类具有相同的名称

答案 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