[英]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");
}
}
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();
}
幾個觀察
示例: com.example.process.entity
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.