我有以下几个实现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 这种依赖的候选人。
这个程序有什么问题? 提前谢谢。
答案 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方法。