2015-09-27 114 views
1

我實現日誌寫接口下面的類(@Inject和@Named註釋給NoSuchBeanDefinitionException

所有與這些名字自定義類不是標準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配置XML文件(APP-config.xml文件)中定義的豆,因此利用組件掃描我的基地裏麪包:

<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與@注入了我的setFileWriter方法,我得到以下異常。 如果我刪除@Named註釋,它執行罰款

org.springframework.beans.factory.NoSuchBeanDefinitionException:未找到類型的 預選賽豆 [com.springprogramming.spring.test.model.LogWriter對於 依賴:預計至少有1個bean符合自動連線 這個依賴關係的候選者。

這個程序有什麼問題? 在此先感謝。

回答

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方法。

+0

感謝hotzst的答案,我實際上在學習註釋並試着嘗試使用不同的註釋。因此,我嘗試了各種組合的字段以及setter方法來檢查其用法:) –