所以...我們繼續我們的春季課程。在上一課中,我們研究了使用 setter 的依賴注入。如果您注意到了,那麼我們使用 id 連結來實現值。也就是說,實作是使用 ref 屬性進行的。它看起來像這樣: 清單 1
<bean id="javaDeveloper" class="org.example.JavaDevelopment"/>
<bean id="hiringDepartment" class="org.example.HiringDepartment">
<property name="development" ref="javaDeveloper"/>
</bean>
這裡第4行指的是id“javaDeveloper”,它實作了JavaDevelopment類別的值。如果我們想手動注入值或以其他方式取得值然後注入怎麼辦?讓我們來看一個例子。每個員工都有公民身份和工資。並讓這些實體定義在 HiringDepartment 類別中。讓我們這樣說: 清單 2
package org.example;
public class HiringDepartment {
private Development development; //Определяем интерфейс
private int salary;
private String citizenship;
public void displayInfo(){
System.out.println("Name: " + development.getName());
System.out.println("Job: " + development.getJob());
}
public void setDevelopment(Development development){
this.development = development;
}
public Development getDevelopment(){
return development;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public String getCitizenship() {
return citizenship;
}
public void setCitizenship(String citizenship) {
this.citizenship = citizenship;
}
}
這裡我們新增了 2 個欄位。int 工資和字串 公民身分。我們也為這些物件定義了 getter 和 setter。提醒一下,Spring 在幕後引用這些 getter 和 setter 將值綁定到類別物件。我們還沒有接觸其他類別。然後我們將重做 applicationContext 文件,它定義了我們的物件的 bean。它看起來像這樣: 清單 3
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="javaDeveloper" class="org.example.JavaDevelopment"/>
<bean id="pythonDeveloper" class="org.example.PythonDevelopment"/>
<bean id="hiringDepartment" class="org.example.HiringDepartment">
<property name="development" ref="javaDeveloper"/>
<property name="citizenship" value="USA"/>
<property name="salary" value="5000"/>
</bean>
</beans>
與清單 1 不同,此處新增了另外兩個屬性(第 12 行和第 13 行)。這就是value屬性發揮作用的地方,它是在 property 標記內定義的。讓我再次提醒您,name 屬性的值必須與 bean 引用的物件相符。然後 Spring 使用這些值獨立決定 getter 和 setter。並使用value屬性我們實作欄位的值。請注意,這兩個值都用引號定義,儘管這對於 int 類型來說並不常見。但 Spring 一如既往地決定哪個值應該與哪個類型相關聯。這是由於name屬性而發生的。Spring透過bean的名稱來引用該類別的一個物件並確定該物件的類型。嗯,僅此而已。現在剩下的就是檢查 Main 類別中的更新: 清單 5
package org.example;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String ... args){
//Определяем контекст файл в котором содержатся прописанные нами бины
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//Получем бины, которые были определены в файле applicationContext.xml
HiringDepartment hiringDepartment = context.getBean("hiringDepartment", HiringDepartment.class);
hiringDepartment.displayInfo();
System.out.println("Citizenship: " + hiringDepartment.getCitizenship());
System.out.println("Salary: " + hiringDepartment.getSalary());
context.close(); //Контекст всегда должен закрываться
}
}
這裡不需要做太多改變。只是為了取得結果,我們使用標準輸出流來呼叫 HiringDepartment 類別的 getter。結果,我們得到以下答案:
Name: Alexa
Job: Middle Java developer
Citizenship: USA
Salary: 5000
好的。假設我們有 10 名這樣的員工,他們擁有相同的公民身份並領取相同的工資。假設公司決定增加他們的薪水。然後您必須手動更改所有這 10 個值。太無聊了。如果我們在單獨的檔案中定義這些值並將這些值與bean關聯起來會怎麼樣?然後我們只需要在此文件中更改一次值,引用該值的其餘 bean 將自動更改。讓我們嘗試一下... 為此,我們將在專案結構和 applicationContext.xml 檔案中進行一些更新。首先,在資源資料夾中新增一個副檔名為.properties的新檔案。我將此檔案命名為「myApp.properties」。現在項目結構已採用以下形式: 在文件中我們將寫入以下值:
employee.citizenship="Russia"
employee.salary=6000
「=」號的左邊是變數的名稱(如果可以這麼稱呼的話),右邊是這些變數的值。您可以隨意命名,但像往常一樣,要有意義。是的,句號在這裡發揮戰略作用,而不是句法作用。假設我們也有經理,也有自己的薪水。然後我們可以簡單地將這些變數命名為:manager.salary。即變數的名稱不會重合,互相干擾。現在讓我們更新 applicationContext.xml 檔案。在宣告 bean 之前,必須先寫以下行:
<context:property-placeholder location="classpath:myApp.properties"/>
在這裡,我們定義創建的文件來嵌入值。然後在 value 屬性中,我們將美元符號 $ 放在雙引號中,並在大括號 {} 中寫入 myApp.properties 檔案中的變數名稱:
<property name="salary" value="${employee.salary}"/>
結果,Spring 會尋找該變量,取得其值,並將其附加到類別物件。完整的程式碼如下: 清單 6
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="classpath:myApp.properties"/>
<bean id="javaDeveloper" class="org.example.JavaDevelopment"/>
<bean id="pythonDeveloper" class="org.example.PythonDevelopment"/>
<bean id="hiringDepartment" class="org.example.HiringDepartment">
<property name="development" ref="javaDeveloper"/>
<property name="citizenship" value="${employee.citizenship}"/>
<property name="salary" value="${employee.salary}"/>
</bean>
</beans>
讓我們啟動該程式:
Name: Alexa
Job: Middle Java developer
Citizenship: "Russia"
Salary: 6000
一如既往,學習程式設計的最好方法就是程式設計。重複你自己學到的東西,試著更新元素,玩弄程式碼。簡而言之,去做吧。這就是我的全部。感謝您的關注!原始碼位於連結 我的GitHub 加入我的電報頻道 課程內容 待續...
GO TO FULL VERSION