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


公共类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();

}


当我运行该程序时,出现错误(当我在setFileWriter方法上将@Named与@Inject结合使用时,出现以下异常。
如果删除@Named批注,它将执行得很好


  org.springframework.beans.factory.NoSuchBeanDefinitionException:否
  类型的合格豆
  找到[com.springprogramming.spring.test.model.LogWriter]
  依赖关系:期望至少有1个符合自动装配条件的bean
  此依赖项的候选者。


这个程序怎么了?
提前致谢。

最佳答案

我不确定为什么不针对FileWriter设置特定的参数类型,因为方法名称已经表明了这一点(在这种情况下,您不再需要@Named了):

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


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

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


我个人发现,在字段上具有注释而不是setter方法更为干净,因为在许多情况下,您不需要显式的setter方法。

07-24 09:38
查看更多