什麼是依賴注入
- 依賴 : 指Bean對象的創建依賴於容器 .
- 注入 : 指Bean對象所依賴的資源 , 由容器來設置和裝配 .
依賴注入的類型有三類
- 基本數據類型和String類型
- 其他bean類型(在配置文件中或者註解配置過的bean)
- 複雜類型/集合類型
注入的方式有三種
- 使用構造函數注入
構造函數方式注入:使用標籤constructor-arg
- type:用於指定注入的數據類型
- index:用於指定注入的數據給構造函數中指定索引位置的參數賦值,索引位置是從0開始
- name:用於指定給構造函數中指定名稱的參數賦值(推薦使用)
- value:用於提供基本類型和string類型數據賦值
- ref:用於指定其他的bean數據類型,是指在spring容器中出現過的bean對象,引用id進來
測試:
實體類
public class User {
private String name;
private Integer age;
private Date date;
public User(){
}
public User(String name, Integer age, Date date) {
this.name = name;
this.age = age;
this.date = date;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", date=" + date +
'}';
}
}
Spring核心配置文件beans.xml
<bean id="user" class="com.Dao.User">
<constructor-arg name="name" value="chenhui"></constructor-arg>
<constructor-arg name="age" value="22"></constructor-arg>
<constructor-arg name="date" ref="date"></constructor-arg>
</bean>
<bean id="date" class="java.util.Date"></bean>
測試類:
@Test
public void test(){
//通過ClassPathXmlApplicationContext對象加載配置文件方式將javabean對象交給spring來管理
ApplicationContext Context=new ClassPathXmlApplicationContext("bean.xml");
//獲取Spring容器中的bean對象,通過id和類字節碼來獲取
User user = Context.getBean("user", User.class);
System.out.println(user);
}
結果:
- 使用set方法注入(常用)
- 使用標籤property
- name:用於指定注入時所調用的set方法名稱
- value:用於提供基本類型和string類型數據賦值
- ref:用於指定其他的bean數據類型,是指在spring容器中出現過的bean對象,引用id進來
要求被注入的屬性 , 必須有set方法 , set方法的方法名由set + 屬性首字母大寫 , 如果屬性是boolean類型 , 沒有set方法 , 是 is .
測試:
實體類
public class User {
private String name;
private Integer age;
private Date date;
public User(){
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", date=" + date +
'}';
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public void setDate(Date date) {
this.date = date;
}
}
Spring核心配置文件beans.xml
<!-- 使用的是默認構造函數創建對象-->
<bean id="user" class="com.Dao.User">
<property name="name" value="chenhui"></property>
<property name="age" value="22"></property>
<property name="date" ref="date"></property>
</bean>
<bean id="date" class="java.util.Date"></bean>
測試類:
@Test
public void test(){
//通過ClassPathXmlApplicationContext對象加載配置文件方式將javabean對象交給spring來管理
ApplicationContext Context=new ClassPathXmlApplicationContext("bean.xml");
//獲取Spring容器中的bean對象,通過id和類字節碼來獲取
User user = Context.getBean("user", User.class);
System.out.println(user);
}
結果:
複雜類型/集合類型的注入
- 用於給list結構集合注入標籤:
- list array set
- 用於給map結構集合注入的標籤:
- map property
- 結構相同,標籤可以互換,即標籤體可以互換使用,不會報錯
測試:
實體類:
public class User {
private String[] strings;
private List<String> list;
private Map map;
private Properties properties;
private Set set;
public void setStrings(String[] strings) {
this.strings = strings;
}
public void setList(List<String> list) {
this.list = list;
}
public void setMap(Map map) {
this.map = map;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public void setSet(Set set) {
this.set = set;
}
public User(){
}
public void print(){
System.out.println(Arrays.toString(strings));
System.out.println(list);
System.out.println(map);
System.out.println(set);
System.out.println(properties);
}
}
Spring核心配置文件beans.xml
<bean id="user" class="com.Dao.User">
<property name="strings">
<array>
<value>dasd</value>
<value>aaaa</value>
<value>dfff</value>
</array>
</property>
<property name="list">
<list>
<value>dff</value>
<value>hjjgj</value>
<value>dgfhfgh</value>
</list>
</property>
<property name="set">
<set>
<value>1213</value>
<value>1fsdf</value>
<value>trg</value>
</set>
</property>
<property name="map">
<map>
<!-- 使用第一種方式-->
<entry key="chenhui" value="123"></entry>
<entry key="xie" value="123"></entry>
<!-- 也可使用第二種方式-->
<entry key="chen">
<value>333</value>
</entry>
</map>
</property>
<property name="properties">
<props>
<prop key="cc">1</prop>
<prop key="ww">2</prop>
<prop key="dsa">3</prop>
</props>
</property>
</bean>
測試類:
@Test
public void test(){
//通過ClassPathXmlApplicationContext對象加載配置文件方式將javabean對象交給spring來管理
ApplicationContext Context=new ClassPathXmlApplicationContext("bean.xml");
//獲取Spring容器中的bean對象,通過id和類字節碼來獲取
User user = Context.getBean("user", User.class);
//調用方法使集合類型注入執行
user.print();
}
結果:
當結構相同,標籤可以互換
<bean id="user" class="com.Dao.User">
<property name="strings">
<set>
<value>1213</value>
<value>1fsdf</value>
<value>trg</value>
</set>
</property>
<property name="list">
<array>
<value>dasd</value>
<value>aaaa</value>
<value>dfff</value>
</array>
</property>
<property name="set">
<list>
<value>dff</value>
<value>hjjgj</value>
<value>dgfhfgh</value>
</list>
</property>
<property name="map">
<props>
<prop key="cc">1</prop>
<prop key="ww">2</prop>
<prop key="dsa">3</prop>
</props>
</property>
<property name="properties">
<map>
<!-- 使用第一種方式-->
<entry key="chenhui" value="123"></entry>
<entry key="xie" value="123"></entry>
<!-- 也可使用第二種方式-->
<entry key="chen">
<value>333</value>
</entry>
</map>
</property>
</bean>
結果:
[圖片上傳中...(image-85fd26-1613912046687-0)]
最後
歡迎關注公衆號:前程有光,領取一線大廠Java面試題總結+各知識點學習思維導+一份300頁pdf文檔的Java核心知識點總結! 這些資料的內容都是面試時面試官必問的知識點,篇章包括了很多知識點,其中包括了有基礎知識、Java集合、JVM、多線程併發、spring原理、微服務、Netty 與RPC 、Kafka、日記、設計模式、Java算法、數據庫、Zookeeper、分佈式緩存、數據結構等等。