NoSuchBeanDefinitionException:没有定义名为'name'的bean

时间:2017-12-11 17:05:48

标签: java spring spring-mvc

我正在尝试一个非常基本的例子。我试图看到其他堆栈溢出的答案,但无法解决这个问题。我是这个领域的新手,如果我遗漏了任何东西,请告诉我。

这是我的错误日志:

  

2017年12月11日上午8:40:20 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions   信息:从类路径资源[BeanDefinition.xml]加载XML bean定义   线程“main”中的异常org.springframework.beans.factory.NoSuchBeanDefinitionException:未定义名为“MySpringBeanWithDepenency”的bean       at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:638)       在org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1159)       在org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:282)       在org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)       在org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:973)       在model.main.Main.main(Main.java:18)

明确表示无法找到MySpringBeanWithDepenency

这是我的BeanDefinition.xml

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-2.5.xsd">

<context:component-scan base-package="model.testbean" />
<context:component-scan base-package="model.writer" />

这是我的主要课程:

package model.main;

/**
 * Created by barora on 12/10/2017.
 */

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import model.testbean.MySpringBeanWithDepenency;

public class Main {
    public static void main(String args[]){
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "BeanDefinition.xml");
        BeanFactory factory = context;
        MySpringBeanWithDepenency test = (MySpringBeanWithDepenency) factory.getBean("MySpringBeanWithDepenency");
        test.run();
    }
}

这是我的MySpringBeanWithDepenency

package model.testbean;

/**
 * Created by barora on 12/10/2017.
 */

import org.springframework.beans.factory.annotation.Autowired;

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

import model.writer.IWriter;
import org.springframework.stereotype.Service;


@Service
public class MySpringBeanWithDepenency {

    private IWriter writer;

    @Autowired
    public void setWriter(IWriter writer){
        this.writer = writer;
    }

    public void run(){
        String s = "This is my test";
        writer.writer(s);
    }
}

这是我的文件夹结构:

enter image description here

3 个答案:

答案 0 :(得分:2)

尝试调试添加:

System.out.println("Bean names: " + Arrays.toString(context.getBeanNamesForType(MySpringBeanWithDependency.class)));

如果这打印出一个空列表,那么您的类路径扫描就会出现问题。如果它打印了一个名称,那么这是一个可以用来获取bean的名称。

或者,代替factory.getBean(String name)使用factory.getBean(MySpringBeanWithDependency.class),这样您就不需要知道Spring给你的bean命名了什么。

答案 1 :(得分:1)

尝试MySpringBeanWithDepenency test = (MySpringBeanWithDepenency) factory.getBean(MySpringBeanWithDepenency.class);

<强> EDITED

所以我使用给定的项目结构重新创建了代码。除了我使用IWriter

的以下代码之外,它有效
  package model.writer;

    public interface IWriter {

        void writer(String s);
    }

和实施

package model.writer;

import org.springframework.stereotype.Component;

@Component
public class NiceWriter implements IWriter {
    public void writer(String s) {

    }
}

已编辑2 如果你想为IWriter接口实现两个实现,并且两者都应该是spring managed beans,你需要帮助spring容器来决定你想要它自动装配哪个。请使用@Qualifier。有关详细信息,请参阅tutorial

答案 2 :(得分:0)

默认bean名称是mySpringBeanWithDepenency,带有“ m” 您应该使用

MySpringBeanWithDepenency test = (MySpringBeanWithDepenency)factory.getBean("mySpringBeanWithDepenency");