文章已託管到GitHub,你們能夠去GitHub查看閱讀,歡迎老闆們前來Star! 搜索關注微信公衆號 碼出Offer 領取各類學習資料!java
Dependency Injection即爲依賴注入,簡稱DI 。git
簡單來講,在Spring建立對象的同時,爲其屬性賦值,稱之爲依賴注入。github
形象來講,組件之間依賴關係由容器在運行期決定的,即由容器動態的將某個依賴關係注入到組件之中。spring
簡單瞭解了DI(依賴注入),在看依賴注入這個詞,咱們也能夠將依賴注入以IOC(控制反轉)的形式拆分它。數組
顧名思義,依賴注入是由「依賴」和「注入」兩個詞彙組合而成,那麼咱們再一次順藤摸瓜,分別分析這兩個詞語!微信
依賴一詞,能夠拆分紅不少元素。好比說,達成依賴條件必須是兩個對象 ,誰依賴誰 ,某一個對象依賴另外一個對象的什麼 。這裏咱們能夠根據這幾個條件列舉出這幾種狀況:框架
注入一次,能夠也能夠拆分紅不少元素。好比說,注入能夠分解成誰注入誰 ,注入了什麼 。這裏咱們也能夠根據這兩個條件來列舉出這幾種狀況:ide
Setter方法注入,它只須要提供對應的Setter方法接口實現注入,因爲JavaBean通常都實現了Setter方法,因此Setter方法注入也成爲了咱們經常使用的注入方法之一。學習
定義一個JavaBean並賦予其Setter方法測試
package com.mylifes1110.bean;
import java.util.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
//Lombok@Data註解提供了Setter方法
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String password;
private String sex;
private Integer age;
private Date bornDate;
private String[] hobbys;
private Set<String> phones;
private List<String> names;
private Map<String, String> countries;
private Properties files;
}
複製代碼
注意:Spring底層對Date日期類型作了處理,默認處理格式爲「yyyy/MM/dd」
<bean id="User" class="com.mylifes1110.bean.User">
<!--注入基本數據類型-->
<property name="id" value="1"/>
<property name="password" value="123456"/>
<property name="sex" value="male"/>
<property name="age" value="18"/>
<!--注入日期類型-->
<property name="bornDate" value="1999/09/09"/>
<!--注入數組類型-->
<property name="hobbys">
<array>
<value>Run</value>
<value>Jump</value>
<value>Climb</value>
</array>
</property>
<!--注入List集合類型-->
<property name="names">
<list>
<value>Ziph</value>
<value>Join</value>
<value>Marry</value>
</list>
</property>
<!--注入Set集合類型-->
<property name="phones">
<set>
<value>110</value>
<value>119</value>
<value>120</value>
</set>
</property>
<!--注入Properties類型-->
<property name="files">
<props>
<prop key="first">One</prop>
<prop key="second">Two</prop>
<prop key="third">Three</prop>
</props>
</property>
<!--注入Map集合類型-->
<property name="countries">
<map>
<entry key="CHINA" value="中國"/>
<entry key="USA" value="美國"/>
<entry key="UK" value="英國"/>
</map>
</property>
</bean>
複製代碼
將Service層須要一個Dao層實現類對象,咱們能夠使用注入方式來實現對Service層和Dao層的對象關聯
<bean id="UserDao" class="com.mylifes1110.dao.impl.UserDaoImpl"/>
<bean id="UserService" class="com.mylifes1110.service.impl.UserServiceImpl">
<property name="userDao" ref="UserDao"/>
</bean>
複製代碼
將建立的Bean對象注入到另外一個對象中,好比一個JavaBean對象中做爲了另外一個JavaBean對象的屬性
<!--次要bean,被做爲屬性-->
<bean id="address" class="com.mylifes1110.bean.Address">
<property name="position" value="上海市" />
<property name="zipCode" value="100001" />
</bean>
<!--主要bean,操做的主體-->
<bean id="user" class="com.mylifes1110.bean.User">
<!--address屬性引用address對象-->
<property name="address" ref="address" />
</bean>
複製代碼
建立對象時,Spring工廠會經過構造方法爲對象的屬性賦值。因爲某些框架或者項目中並無爲JavaBean提供Setter方法,咱們就能夠利用其構造方法來注入。不要和我說,沒有提供構造方法哈!(開個玩笑!)
定義一個JavaBean對象,爲其提供構造方法
public class Student {
private Integer id;
private String name;
private String sex;
private Integer age;
//Constructors
public Student(Integer id , String name , String sex , Integer age){
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
}
複製代碼
<!--構造注入-->
<bean id="u3" class="com.mylifes1110.bean.Student">
<!-- 除標籤名稱有變化,其餘均和Set注入一致 -->
<constructor-arg name="id" value="1234" />
<constructor-arg name="name" value="tom" />
<constructor-arg name="age" value="20" />
<constructor-arg name="sex" value="male" />
</bean>
複製代碼
不用在配置中 指定爲哪一個屬性賦值,及賦什麼值。由spring自動根據某個 "原則" ,在工廠中查找一個bean,爲屬性注入屬性值。
將Dao層實現類對象注入到Service層並調用方法得以測試
package com.mylifes1110.service.impl;
import com.mylifes1110.bean.User;
import com.mylifes1110.dao.UserDao;
import com.mylifes1110.service.UserService;
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public int insertUser(User user) {
System.out.println("------insertUser and UserService------");
return userDao.insertUser(null);
}
}
複製代碼
基於名稱自動注入值
<bean id="UserDao" class="com.mylifes1110.dao.impl.UserDaoImpl"/>
<!--爲UserServiceImpl中的屬性基於名稱自動注入值-->
<bean id="userService" class="com.mylifes1110.service.impl.userServiceImpl" autowire="byName"/>
</beans>
複製代碼
基於類型自動注入值,根據實現的接口來判斷並自動注入值,若是實現此接口的實現類太多,它會在不少實現此接口的實現類中選擇名字相同的實現類進行注入。(現根據判斷,若是不成功,則根據名稱注入)
<bean id="userDao" class="com.mylifes1110.dao.UserDaoImpl" />
<!--爲UserServiceImpl中的屬性基於類型自動注入值-->
<bean id="userService" class="com.mylifes1110.service.impl.UserServiceImpl" autowire="byType"/>
</beans>
複製代碼
註解名稱 | 描述 |
---|---|
@Autowired | 基於類型自動注入 |
@Resource | 基於名稱自動注入 |
@Qualifier("userDAO") | 限定要自動注入的bean的id,通常和@Autowired聯用 |
@Value | 注入簡單類型數據 (jdk8種基本數據類型+String類型) |
使用基於類型自動注入,將Dao層注入到Service層
@Service
public class UserServiceImpl implements UserService {
@Autowired //注入類型爲UserDao的bean
@Qualifier("userDao") //若是有多個類型爲UserDao的bean,能夠用此註解從中指定一個
private UserDao userDao;
}
複製代碼
使用基於名稱自動注入,將Dao層注入到Serivce層
@Service
public class UserServiceImpl implements UserService {
@Resource("userDao") //注入id=「userDao」的bean
private UserDao userDao;
}
複製代碼
使用注入簡單類型數據註解來完成簡單注入JavaBean
public class User{
@Value("1") //注入數字
private Integer id;
@Value("Ziph") //注入String
private String name;
}
複製代碼