Java @Inject和@Named注释给出NoSuchBeanDefinitionException
我有以下实现LogWriter接口的类( 所有这些都是具有这些名称的自定义类,而不是标准java包 班级 )内部包com.springprogramming.spring.test.modelJava @Inject和@Named注释给出NoSuchBeanDefinitionException,java,spring,dependency-injection,Java,Spring,Dependency Injection,我有以下实现LogWriter接口的类( 所有这些都是具有这些名称的自定义类,而不是标准java包 班级 )内部包com.springprogramming.spring.test.model @Component public class ConsoleWriter implements LogWriter{ public void write(String st){ System.out.println("in Console writer "+st); } } @Com
@Component
public class ConsoleWriter implements LogWriter{
public void write(String st){
System.out.println("in Console writer "+st);
}
}
@Component("fileWriter")
public class FileWriter implements LogWriter{
public void write(String st){
System.out.println("in Console writer "+st);
}
}
public interface LogWriter {
public void write(String st);
}
@Component
公共类记录器{
private ConsoleWriter consoleWriter;
private LogWriter fileWriter;
@Inject
public void setConsoleWriter(ConsoleWriter consoleWriter) {
this.consoleWriter = consoleWriter;
}
@Inject
@Named(value="fileWriter")
public void setFileWriter(LogWriter fileWriter) {
this.fileWriter = fileWriter;
}
public void writeFile(String text){
fileWriter.write(text);
}
public void writeConsole(String text){
if(consoleWriter!=null)
consoleWriter.write(text);
}
@PostConstruct
public void init(){
System.out.println("init");
}
@PreDestroy
public void destroy(){
System.out.println("destroy");
}
}
我试图跳过spring配置xml文件(app config.xml)中定义的bean,因此在我的基本包中使用组件扫描:
<context:annotation-config></context:annotation-config>
<context:component-scan
base-package="com.springprogramming.spring.test.model">
</context:component-scan>
当我运行这个程序时,我得到了一个错误(当我在setFileWriter方法上使用@Named with@Inject时,我得到了以下异常。
如果我删除@Named注释,它将正常执行
org.springframework.beans.factory.noSuchBean定义异常:否
类型的限定bean
找到的[com.springprogramming.spring.test.model.LogWriter]
依赖项:至少需要1个符合autowire条件的bean
此依赖项的候选项
这个程序怎么了?
提前感谢。我不知道为什么您不为FileWriter指定参数类型,因为方法名称已经表明了这一点(在这种情况下,您不再需要@Named): 如果这不是您想要的,您应该将
@命名的
与参数一起放置:
public void setFileWriter(@Named(“fileWriter”)LogWriter fileWriter){
this.fileWriter=fileWriter;
}
另见《春天的故事》。
这是一种非常不寻常的设置fileWriter的方法,更好的方法是向fileWriter注入字段声明:
@Inject
@Named("fileWriter")
private LogWriter fileWriter;
我个人觉得在字段上添加注释比在setter方法上添加注释更干净,因为在许多情况下,您不需要显式的setter方法。感谢hotzst的回答,我实际上正在学习注释并尝试使用不同的注释。因此,我在我们讨论时尝试了字段上的各种组合ll和setter方法上检查其用法:)
public void setFileWriter(FileWriter fileWriter) {
this.fileWriter = fileWriter;
}
@Inject
@Named("fileWriter")
private LogWriter fileWriter;