我會建議先看看普通的Spring配置,以瞭解基本事物(如注入)的工作原理。如果你設法在Spring中獲得它的懸掛,這個過程在Spring MVC/Spring Boot /等中將非常類似。就我個人而言,我發現它試圖一次性處理多個概念(視圖解析器,不同的配置文件,視圖,存儲庫,多個註釋,多種配置方式等),所以我傾向於從最簡單的概念開始並構建我的一路攀升。一旦您對注射的工作方式感到滿意,您可以在其他地方輕鬆應用這些知識。
至於java配置和註釋,它們允許更快更清潔的開發。 XML非常冗長,很難維護,並且很容易出錯,部分原因是IDE在處理基於Java的配置時通常更有幫助。也許這就是爲什麼你閱讀XML已被棄用。我會推薦去java/auto配置而不是XML,除非你真的需要(或者對它感興趣)。
現在談談如何做到這一點。一個完整的(但最少)工作彈簧例如:
/* Bean definition
@Component tells Spring that this is a bean. There are a few similar annotations.
It will be discovered during the component scan, as it has @Component annotation */
package main.java.org.example;
import org.springframework.stereotype.Component;
@Component
public class Greeting {
private String greeting = "Hello";
public String getGreeting() {
return this.greeting;
}
public void setGreeting(String greeting) {
this.greeting = greeting;
}
}
/* Another bean definition.
It has another bean as a dependency, which we inject with a setter. */
package main.java.org.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class GreetingCollector {
private Greeting greeting;
/* This is how you do setter injection */
@Autowired
public void setGreeting(Greeting greeting) {
this.greeting = greeting;
}
public String getGreeting() {
return greeting.getGreeting();
}
}
/* This is a minimal config class.
@ComponentScan instructs to look for classes that are
annotated with @Component annotation (in other words, beans) */
package main.java.org.example;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@ComponentScan
@Configuration
public class Config {}
如果你想這樣做明確:
package main.java.org.example;
import main.java.org.example.GreetingCollector;
import main.java.org.example.Greeting;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Config {
@Bean
public Greeting greeting() {
return new Greeting();
}
@Bean
public GreetingCollector greetingCollector(Greeting greeting) {
return new GreetingCollector(greeting);
}
}
如果你想運行它只是爲了看看它是如何工作的:
import main.java.org.example.Config;
import main.java.org.example.GreetingCollector;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class AppContext {
public static void main(String args[]) {
System.out.println("Configuring application context...");
ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
GreetingCollector collector = (GreetingCollector) context.getBean("greetingCollector");
System.out.println(collector.getGreeting());
}
}
當然,Spring的web應用會有點不同,但基本的注入思路是一樣的。首先,您需要聲明bean(通過使用@Bean,@Component或任何其他註釋:有關差異,請參閱here和here)。你用@Autowired註解一個setter或構造函數(或者甚至是一個字段),指定參數(不一定需要具體類 - 接口,抽象類也可以),將它們分配到適當的字段。創建一個需要處理bean實例化的配置類。您不需要將組件放在與config類相同的文件夾中,因爲您始終可以指定在哪裏查找組件。最後,如果你想要一個更細粒度的控件,你總是可以在配置類中明確聲明bean(所謂的JavaConfig,而基於@ComponentScan
的配置有時可能被稱爲autoconfig)。這應該足以讓你開始,並給你詞彙搜索更先進的東西。
當然,使用Spring Boot時,所有東西都會更加抽象/更快。