簡體   English   中英

Spring Boot 無法識別接口

[英]Spring Boot not recognizing Interface

我有一個這樣的界面:

public interface Animal {
  void setName(String animal);
  String getName();
}

我有一個實現接口的類:

@Component
public class Dog implements Animal {
    private String name;
    public void setName(String name) {
          this.name= name;
    }

    public String getName() {
          return this.name;
    }
}

在另一個類(ProcessAnimal)中,我 AutoWire 接口:

public class ProcessAnimal {
     @Autowired
     public Animal animal;

     public void processAnimals() {
         animal.setName("Fido");
     }
}

我只有一個實現Animal類,所以這應該可以工作,但是,當它遇到animal.setName("Fido");時,我得到一個NullPointerException animal.setName("Fido"); 線。 IntelliJ 抱怨Autowired members must be defined in valid Spring bean (@Component|@Service...)我擁有的Autowired members must be defined in valid Spring bean (@Component|@Service...)定義......我不明白我做錯了什么。 我試圖添加一個@Qualifier ,但它仍然不起作用,而且沒有必要,因為我只有一個實現。

-java
    -com.example.com.AnimalProcessing
    -Animal
       -Animal.java
       -Dog.java
    -ProcessAnimal.java
    -AnimalProcessingApplication.java

動物處理應用程序

@SpringBootApplication
public class AnimalProcessingApplication {
     public static void main(String[] args) {
           SpringApplication.run(AnimalProcessingApplication.class, args);
           run();
     }

     public static void run() {
           ProcessAnimal processAnimal = new ProcessAnimal();
           processAnimal.processAnimals();
     }
}

Animal Processing Application.java 必須在所有類的根文件夾中。 然后自動識別子文件夾中的所有組件。

更新:
使用@Bean 方法創建一個配置類以創建一個帶有 Dog 的實例。 然后你可以擺脫類的@Component 注釋。 這里的問題是無法注入的構造函數字符串名稱。

更新 2:
不要自己創建實例。 讓 spring 容器創建它們。 刪除運行方法。

AnimalProcessingApplication類應該比所有其他類高一級。

您還使用 new 來創建對象,而不是使用依賴注入(自動裝配)。

替換下面 -

ProcessAnimal processAnimal = new ProcessAnimal();

@Autowired
ProcessAnimal processAnimal;

還要確保ProcessAnimal是一個 bean,並且使用自動裝配在這個類中注入了Animal

要使該程序正常工作,需要執行以下操作。

1. ProcessAnimal應該是一個組件。 使用@Component注釋@Component將標記在組件掃描期間自動檢測的類。

@Component
public class ProcessAnimal {
     @Autowired
     public Animal animal;

     public void processAnimals() {
         animal.setName("Fido");
     }
}
  1. 從應用程序上下文中獲取ProcessAnimal類。 spring 將准備ProcessAnimal bean 及其所有依賴項集。

您可以通過多種方式執行此操作,以下是其中之一

@Component
public class CheckRedRunner implements ApplicationRunner {

    @Autowired
    ProcessAnimal process;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        process.processAnimals();
    }

}

應用程序啟動時將運行一個實現 ApplicationRunner 的 bean。

要不然

public static void main(String[] args) {
          ApplicationContext ctx = SpringApplication.run(AnimalProcessingApplication.class, args);
          ProcessAnimal process = ctx.getBean(ProcessAnimal.class);
          process.processAnimals();
     }

幾個觀察

  1. 按照約定,包名使用小寫字母

示例: com.example.process.entity

  1. 請仔細閱讀官方文檔以了解編寫 Spring boot 應用程序的預期方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM