本篇部落格作為Spring入門系列的第一篇部落格,不會講解什麼是Spring以及Spring的發展史這些太理論的東西,主要講解下如何使用IntelliJ IDEA建立第一個Spring專案以及通過一個示例講解下Spring的簡單原理。
1.建立Spring專案
IDE:IntelliJ IDEA
1.1新建專案
1.2選擇專案型別
如果這裡忘記了選擇"Create empty spring-config.xml",也可以新建完專案再新建配置檔案
1.3確定專案名稱及儲存路徑
因為需要下載Spring依賴的包,因此需要載入一會
新建完的專案結構圖如下:
2.Spring簡單測試
新建一個Book類,定義兩個欄位bookName,author和一個例項方法printBookInfo()
public class Book {
private String bookName;
private String author;
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public void printBookInfo() {
System.out.println("Book Name:" + this.bookName + ",Author:" + this.author);
}
}
複製程式碼
如果我們想要輸出圖書資訊,按照傳統的方式,需要以下幾步:
- 建立Book類的例項物件
- 設定例項物件的bookName欄位和author欄位
- 呼叫例項物件的printBookInfo()方法
public class Main {
public static void main(String[] args) {
Book book = new Book();
book.setBookName("平凡的世界");
book.setAuthor("路遙");
book.printBookInfo();
}
}
複製程式碼
執行結果:
Book Name:平凡的世界,Author:路遙
那麼在Spring專案中,如何實現同樣的呼叫呢?
首先,修改spring-config.xml,新增如下配置:
<bean id="book" class="Book">
<property name="bookName" value="平凡的世界"></property>
<property name="author" value="路遙"></property>
</bean>
複製程式碼
然後修改Main的方法為:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
Book book = applicationContext.getBean("book", Book.class);
book.printBookInfo();
}
}
複製程式碼
執行結果:
我們會發現,執行結果和傳統方式一樣,只是多了一些Spring的日誌資訊。
在以上程式碼中,我們並未使用new運算子來建立Book類的例項,但是卻可以得到Book類的例項,這就是Spring的強大之處,所有類的例項的建立都不需要應用程式自己建立,而是交給Spring容器來建立及管理。
3.Spring簡單講解
雖說例項的建立交給Spring容器來建立及管理,但是在上述的程式碼中,什麼時候建立了Book類的例項並對欄位賦值了呢?
為驗證這個疑問,我們修改下Book類
public class Book {
private String bookName;
private String author;
public Book(){
System.out.println(("This is Book constructor."));
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
System.out.println("This is Book setBookName().");
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
System.out.println("This is Book setAuthor().");
this.author = author;
}
public void printBookInfo() {
System.out.println("Book Name:" + this.bookName + ",Author:" + this.author);
}
}
複製程式碼
新增一個Author類
public class Author {
private String name;
private int age;
public Author() {
System.out.println(("This is Author constructor."));
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("This is Author setName().");
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
System.out.println("This is Author setAge().");
this.age = age;
}
public void printAuthorInfo() {
System.out.println("Name:" + this.name + ",Age:" + this.age);
}
}
複製程式碼
修改下spring-config.xml檔案
<bean id="book" class="Book">
<property name="bookName" value="平凡的世界"></property>
<property name="author" value="路遙"></property>
</bean>
<bean id="author" class="Author">
<property name="name" value="路遙"></property>
<property name="age" value="60"></property>
</bean>
複製程式碼
最後,我們修改下Main類的程式碼來Debug下,看下程式碼的執行順序
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
Book book = applicationContext.getBean("book", Book.class);
book.printBookInfo();
Author author = applicationContext.getBean("author", Author.class);
author.printAuthorInfo();
}
}
複製程式碼
為更直觀的展示,請看如下的Gif圖
從圖中,我們可以看出,在執行完 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
後,控制檯先輸出了以下內容:
This is Book constructor. This is Book setBookName(). This is Book setAuthor(). This is Author constructor. This is Author setName(). This is Author setAge().
也就是這句程式碼執行完後,Book類和Author類的例項已經被建立並且欄位已經被賦值,接下來的程式碼只是從Spring容器中獲取例項而已。
4.注意事項
獲取Bean時,第一個引數(bean name)要與spring-config.xml定義的bean id保持一致,比如我們在spring-config.xml中定義的是book,如果在獲取時寫的是Book,就會報錯
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
// 錯誤的beanName
Book book = applicationContext.getBean("Book", Book.class);
book.printBookInfo();
}
}
複製程式碼
報錯資訊如下: