本教程原始碼請訪問:tutorial_demo
一、什么是依賴注入
依賴注入:Dependency Injection ,指容器負責創建和維護物件之間的依賴關系,而不是通過物件本身負責自己的創建和解決自己的依賴,在當前類需要用到其他類的物件,由Spring為我們提供,我們只需要在配置中說明,
二、如何進行注入
2.1、建構式注入
2.1.1、創建專案
-
在Idea中新建Maven工程;
-
工程創建完成后添加相應的坐標,
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.codeaction</groupId> <artifactId>di</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.6.RELEASE</version> </dependency> </dependencies> </project>
2.1.2、添加User類
package org.codeaction.bean;
import java.util.Date;
/**
* 用戶類
*/
public class User1 {
private String name;
private Integer age;
private String address;
private Date birthday;
//有參構造方法
public User(String name, Integer age, String address, Date birthday) {
this.name = name;
this.age = age;
this.address = address;
this.birthday = birthday;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
", birthday=" + birthday +
'}';
}
}
User1類中一定要有有參的構造方法,
2.1.3、添加XML組態檔
XML檔案在resource目錄下,
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="now" ></bean>
<bean id="user1" >
<!-- 通過建構式注入屬性 -->
<constructor-arg name="name" value="https://www.cnblogs.com/codeaction/p/Tom"></constructor-arg>
<constructor-arg name="age" value="https://www.cnblogs.com/codeaction/p/10"></constructor-arg>
<constructor-arg name="address" value="https://www.cnblogs.com/codeaction/p/上海"></constructor-arg>
<constructor-arg name="birthday" ref="now"></constructor-arg>
</bean>
</beans>
建構式注入使用constructor-arg標簽,這個標簽在bean標簽的內部,
constructor-arg標簽中的屬性:
- type:指定要注入的資料的資料型別,該資料型別也是建構式中某個或某些引數的型別;
- index:指定要注入的資料給建構式中指定索引位置的引數賦值,索引的位置是從0開始;
- name:指定給建構式中指定名稱的引數賦值;
- value:提供基本型別和String型別的資料;
- ref:指定其他的bean型別資料,它指的就是在spring的Ioc核心容器中出現過的bean物件,
前三個屬性用于指定給建構式中哪個引數賦值,其中name屬性最常用,
2.1.4、添加測驗方法
package org.codeaction.test;
import org.codeaction.bean.User1;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User1 user1 = (User1) context.getBean("user1");
System.out.println(user1);
}
}
運行main方法,控制臺輸出如下:
User1{name='Tom', age=10, address='上海', birthday=Mon May 25 09:01:58 CST 2020}
2.2、set方法注入
2.2.1、添加User類
package org.codeaction.bean;
import java.util.Date;
public class User2 {
private String name;
private Integer age;
private String address;
private Date birthday;
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public void setAddress(String address) {
this.address = address;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User2{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
", birthday=" + birthday +
'}';
}
}
User2類中一定要有set方法,
2.2.2、修改XML組態檔
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="now" ></bean>
<bean id="user1" >
<!-- 通過建構式注入屬性 -->
<constructor-arg name="name" value="https://www.cnblogs.com/codeaction/p/Tom"></constructor-arg>
<constructor-arg name="age" value="https://www.cnblogs.com/codeaction/p/10"></constructor-arg>
<constructor-arg name="address" value="https://www.cnblogs.com/codeaction/p/上海"></constructor-arg>
<constructor-arg name="birthday" ref="now"></constructor-arg>
</bean>
<bean id="user2" >
<!-- 通過set方法注入 -->
<property name="name" value="https://www.cnblogs.com/codeaction/p/Bob"></property>
<property name="age" value="https://www.cnblogs.com/codeaction/p/20"></property>
<property name="address" value="https://www.cnblogs.com/codeaction/p/北京"></property>
<property name="birthday" ref="now"></property>
</bean>
</beans>
2.2.3、修改測驗方法
package org.codeaction.test;
import org.codeaction.bean.User1;
import org.codeaction.bean.User2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//User1 user1 = (User1) context.getBean("user1");
//System.out.println(user1);
User2 user2 = (User2) context.getBean("user2");
System.out.println(user2);
}
}
運行main方法,控制臺輸出如下:
User2{name='Bob', age=20, address='北京', birthday=Mon May 25 09:37:17 CST 2020}
2.3、注入復雜型別屬性
本質上還是給屬性注入值,只是被注入的屬性都是復雜型別(陣列,List,Set,Map,Properties),
2.3.1、添加User類
package org.codeaction.bean;
import java.util.*;
public class User3 {
private String[] hobbies1;
private List<String> hobbies2;
private Set<String> hobbies3;
private Map<String, String> idInfo1;
private Properties idInfo2;
public void setHobbies1(String[] hobbies1) {
this.hobbies1 = hobbies1;
}
public void setHobbies2(List<String> hobbies2) {
this.hobbies2 = hobbies2;
}
public void setHobbies3(Set<String> hobbies3) {
this.hobbies3 = hobbies3;
}
public void setIdInfo1(Map<String, String> idInfo1) {
this.idInfo1 = idInfo1;
}
public void setIdInfo2(Properties idInfo2) {
this.idInfo2 = idInfo2;
}
public void show() {
System.out.println("array----" + Arrays.toString(hobbies1));
System.out.println("list----" + hobbies2);
System.out.println("set----" + hobbies3);
System.out.println("map----" + idInfo1);
System.out.println("properties----" + idInfo2);
}
}
2.3.2、修改XML組態檔
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="now" ></bean>
<bean id="user1" >
<!-- 通過建構式注入屬性 -->
<constructor-arg name="name" value="https://www.cnblogs.com/codeaction/p/Tom"></constructor-arg>
<constructor-arg name="age" value="https://www.cnblogs.com/codeaction/p/10"></constructor-arg>
<constructor-arg name="address" value="https://www.cnblogs.com/codeaction/p/上海"></constructor-arg>
<constructor-arg name="birthday" ref="now"></constructor-arg>
</bean>
<bean id="user2" >
<!-- 通過set方法注入 -->
<property name="name" value="https://www.cnblogs.com/codeaction/p/Bob"></property>
<property name="age" value="https://www.cnblogs.com/codeaction/p/20"></property>
<property name="address" value="https://www.cnblogs.com/codeaction/p/北京"></property>
<property name="birthday" ref="now"></property>
</bean>
<!-- 注入復雜型別屬性 -->
<bean id="user3" >
<!-- 注入復雜型別屬性 -->
<property name="hobbies1">
<array>
<value>籃球</value>
<value>讀書</value>
<value>帆船</value>
</array>
</property>
<property name="hobbies2">
<list>
<value>太極</value>
<value>自由搏擊</value>
<value>詠春</value>
</list>
</property>
<property name="hobbies3">
<set>
<value>旅游</value>
<value>蹦極</value>
<value>馬拉松</value>
</set>
</property>
<property name="idInfo1">
<map>
<entry key="name" value="https://www.cnblogs.com/codeaction/p/John"></entry>
<entry key="age">
<value>20</value>
</entry>
<entry key="gender" value="https://www.cnblogs.com/codeaction/p/男"></entry>
</map>
</property>
<property name="idInfo2">
<props>
<prop key="address">廣州</prop>
<prop key="height">180</prop>
</props>
</property>
</bean>
</beans>
用于為List結構注入的標簽:list、array、set;
用于為Map結構注入的標簽:map、props;
結構相同,標簽可以互換,
2.3.3、修改測驗方法
package org.codeaction.test;
import org.codeaction.bean.User1;
import org.codeaction.bean.User2;
import org.codeaction.bean.User3;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//User1 user1 = (User1) context.getBean("user1");
//System.out.println(user1);
//User2 user2 = (User2) context.getBean("user2");
//System.out.println(user2);
User3 user3 = (User3)context.getBean("user3");
user3.show();
}
}
運行main方法,控制臺輸出如下:
array----[籃球, 讀書, 帆船]
list----[太極, 自由搏擊, 詠春]
set----[旅游, 蹦極, 馬拉松]
map----{name=John, age=20, gender=男}
properties----{height=180, address=廣州}
2.3.4、修改XML組態檔,互換標簽
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="now" ></bean>
<bean id="user1" >
<!-- 通過建構式注入屬性 -->
<constructor-arg name="name" value="https://www.cnblogs.com/codeaction/p/Tom"></constructor-arg>
<constructor-arg name="age" value="https://www.cnblogs.com/codeaction/p/10"></constructor-arg>
<constructor-arg name="address" value="https://www.cnblogs.com/codeaction/p/上海"></constructor-arg>
<constructor-arg name="birthday" ref="now"></constructor-arg>
</bean>
<bean id="user2" >
<!-- 通過set方法注入 -->
<property name="name" value="https://www.cnblogs.com/codeaction/p/Bob"></property>
<property name="age" value="https://www.cnblogs.com/codeaction/p/20"></property>
<property name="address" value="https://www.cnblogs.com/codeaction/p/北京"></property>
<property name="birthday" ref="now"></property>
</bean>
<!-- 注入復雜型別屬性 -->
<bean id="user3" >
<!-- 注入復雜型別屬性 -->
<property name="hobbies1">
<set>
<value>旅游</value>
<value>蹦極</value>
<value>馬拉松</value>
</set>
</property>
<property name="hobbies2">
<array>
<value>籃球</value>
<value>讀書</value>
<value>帆船</value>
</array>
</property>
<property name="hobbies3">
<list>
<value>太極</value>
<value>自由搏擊</value>
<value>詠春</value>
</list>
</property>
<property name="idInfo1">
<props>
<prop key="address">廣州</prop>
<prop key="height">180</prop>
</props>
</property>
<property name="idInfo2">
<map>
<entry key="name" value="https://www.cnblogs.com/codeaction/p/John"></entry>
<entry key="age">
<value>20</value>
</entry>
<entry key="gender" value="https://www.cnblogs.com/codeaction/p/男"></entry>
</map>
</property>
</bean>
</beans>
運行main方法,控制臺輸出如下:
array----[旅游, 蹦極, 馬拉松]
list----[籃球, 讀書, 帆船]
set----[太極, 自由搏擊, 詠春]
map----{height=180, address=廣州}
properties----{age=20, name=John, gender=男}
通過上面的修改,說明標簽結構相同,標簽可以互換,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/181801.html
標籤:Java
