【问题标题】:@Inject and @Named annotation giving NoSuchBeanDefinitionException@Inject 和 @Named 注释给出 NoSuchBeanDefinitionException
【发布时间】:2015-09-27 12:43:11
【问题描述】:

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

公共类记录器{

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) 中定义的 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: 否 类型的限定 bean [com.springprogramming.spring.test.model.LogWriter] 找到 依赖项:预计至少有 1 个符合自动装配条件的 bean 这种依赖的候选者。

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

【问题讨论】:

    标签: java spring dependency-injection


    【解决方案1】:

    我不确定你为什么不为 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 方法。

    【讨论】:

    • 感谢 hotzst 的回答,我实际上正在学习注释并尝试尝试不同注释的使用。因此,我也尝试在字段和 setter 方法上使用各种组合来检查其用法:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多