Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @Inject和@Named注释给出NoSuchBeanDefinitionException_Java_Spring_Dependency Injection - Fatal编程技术网

Java @Inject和@Named注释给出NoSuchBeanDefinitionException

Java @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

我有以下实现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);
}
}

@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;