@Inject和@Named注释给出NoSuchBeanDefinitionException

时间:2015-09-27 12:43:11

标签: 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);
}
}

@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

public class Logger {

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 config xml文件(app-config.xml)中定义的bean,因此在我的基础包中使用组件扫描:

<context:annotation-config></context:annotation-config>
<context:component-scan
    base-package="com.springprogramming.spring.test.model">
</context:component-scan>

现在在我的主要课程(App3.java)

    public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("/com/springprogramming/spring/test/beans/app-config.xml");

    Logger logger = (Logger)context.getBean("logger");
    logger.writeConsole("HI ");
    logger.writeFile("Hello");

    ((ClassPathXmlApplicationContext)context).close();

}

当我运行这个程序时,我收到错误(当我使用@Named与@Inject相比我的setFileWriter方法时,我得到以下异常。 如果我删除@Named注释,它执行正常

  

org.springframework.beans.factory.NoSuchBeanDefinitionException:没有   合格的bean类型   找到[com.springprogramming.spring.test.model.LogWriter]   依赖:预计至少有1个bean有资格成为autowire   这种依赖的候选人。

这个程序有什么问题? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

我不确定为什么你不为FileWriter制作特定的参数类型,因为方法名称已经暗示了这一点(在这种情况下你不再需要@Named):

public void setFileWriter(FileWriter fileWriter) {
    this.fileWriter = fileWriter;
}

如果那不是您想要的,您应该将@Named放在参数中:     public void setFileWriter(@Named(“fileWriter”)LogWriter fileWriter){         this.fileWriter = fileWriter;     } 另请参见Spring的documentation。 这是设置fileWriter的一种非常不寻常的方法,更好的方法是将FileWriter注入字段的声明:

@Inject
@Named("fileWriter")
private LogWriter fileWriter;

我个人觉得在字段而不是setter方法上注释更清晰,因为在许多情况下你不需要显式的setter方法。