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