我正在尝试一个非常基本的例子。我试图看到其他堆栈溢出的答案,但无法解决这个问题。我是这个领域的新手,如果我遗漏了任何东西,请告诉我。
这是我的错误日志:
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);
}
}
这是我的文件夹结构:
答案 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");