Spring依賴注入(DI)兩種方式的示例詳解
一、依賴注入方式
思考:向一個(gè)類中傳遞數(shù)據(jù)的方式有幾種?
- 普通方法(set方法)
- 構(gòu)造方法
思考:依賴注入描述了在容器中建立bean與bean之間依賴關(guān)系的過程,如果bean運(yùn)行需要的是數(shù)字或字符串呢?
- 引用類型
- 簡(jiǎn)單類型(基本數(shù)據(jù)類型與String)
依賴注入方式:
setter注入
- 簡(jiǎn)單類型
- 引用類型
構(gòu)造器注入
- 簡(jiǎn)單類型
- 引用類型
二、setter注入
引用類型
在bean中定義引用類型屬性并提供可訪問的set方法
import com.itheima.dao.BookDao;
import com.itheima.service.BookService;
public class BookServiceImpl implements BookService {
private BookDao bookDao;
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
配置中使用property標(biāo)簽ref屬性注入引用類型對(duì)象
<!--注入引用類型-->
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
<!--property標(biāo)簽:設(shè)置注入屬性-->
<!--name屬性:設(shè)置注入的屬性名,實(shí)際是set方法對(duì)應(yīng)的名稱-->
<!--ref屬性:設(shè)置注入引用類型bean的id或name-->
<property name="bookDao" ref="bookDao"/>
<property name="userDao" ref="userDao"/>
</bean>
簡(jiǎn)單類型
BookDaoImpl實(shí)現(xiàn)類:
在bean中定義引用類型屬性并提供可訪問的set方法
import com.itheima.dao.BookDao;
public class BookDaoImpl implements BookDao {
private String databaseName;
private int connectionNum;
//setter注入需要提供要注入對(duì)象的set方法
public void setConnectionNum(int connectionNum) {
this.connectionNum = connectionNum;
}
//setter注入需要提供要注入對(duì)象的set方法
public void setDatabaseName(String databaseName) {
this.databaseName = databaseName;
}
public void save() {
System.out.println("book dao save ..." + databaseName + "," + connectionNum);
}
}
applicationContext.xml配置:
配置中使用property屬性value注入簡(jiǎn)單類型對(duì)象
<!--注入簡(jiǎn)單類型-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<!--property標(biāo)簽:設(shè)置注入屬性-->
<!--name屬性:設(shè)置注入的屬性名,實(shí)際是set方法對(duì)應(yīng)的名稱-->
<!--value屬性:設(shè)置注入簡(jiǎn)單類型數(shù)據(jù)值-->
<property name="connectionNum" value="100"/>
<property name="databaseName" value="mysql"/>
</bean>
三、構(gòu)造器注入
引用類型
在bean中定義引用類型屬性并提供可訪問的構(gòu)造方法
public class BookServiceImpl implements BookService{
private BookDao bookDao;
private UserDao userDao;
public BookServiceImpl(BookDao bookDao, UserDao userDao) {
this.bookDao = bookDao;
this.userDao = userDao;
}
}
配置中使用constructor-arg標(biāo)簽ref屬性注入引用類型對(duì)象
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
<constructor-arg name="userDao" ref="userDao"/>
<constructor-arg name="bookDao" ref="bookDao"/>
</bean>
簡(jiǎn)單類型
在bean中定義引用類型屬性并提供可訪問的構(gòu)造方法
public class BookDaoImpl implements BookDao {
private String databaseName;
private int connectionNum;
public BookDaoImpl(String databaseName, int connectionNum) {
this.databaseName = databaseName;
this.connectionNum = connectionNum;
}
}
配置中使用constructor-arg標(biāo)簽ref屬性注入引用類型對(duì)象
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<!--根據(jù)構(gòu)造方法參數(shù)名稱注入-->
<constructor-arg name="connectionNum" value="10"/>
<constructor-arg name="databaseName" value="mysql"/>
</bean>
參數(shù)適配(了解)
配置中使用constructor-arg標(biāo)簽type屬性注入引用類型對(duì)象
<!--解決形參名稱的問題,與形參名不耦合-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<!--根據(jù)構(gòu)造方法參數(shù)類型注入-->
<constructor-arg type="int" value="10"/>
<constructor-arg type="java.lang.String" value="mysql"/>
</bean>
配置中使用constructor-arg標(biāo)簽index屬性注入引用類型對(duì)象
<!--解決參數(shù)類型重復(fù)問題,使用位置解決參數(shù)匹配-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<!--根據(jù)構(gòu)造方法參數(shù)位置注入-->
<constructor-arg index="0" value="mysql"/>
<constructor-arg index="1" value="100"/>
</bean>
四、依賴注入方式選擇
1、強(qiáng)制依賴使用構(gòu)造器進(jìn)入,使用setter注入有概率不進(jìn)入注入導(dǎo)致null對(duì)象出現(xiàn)
2、可選依賴使用setter注入進(jìn)行,靈活性強(qiáng)
3、Spring框架倡導(dǎo)使用構(gòu)造器,第三方框架內(nèi)部大多數(shù)采用構(gòu)造器注入的形式進(jìn)行數(shù)據(jù)初始化,相對(duì)嚴(yán)謹(jǐn)
4、如果有必要可以兩者同時(shí)使用,使用構(gòu)造器注入完成強(qiáng)制依賴的注入,使用setter注入完成可依賴的注入
5、實(shí)際開發(fā)過程中還要根據(jù)實(shí)際情況分析,如果受控對(duì)象沒有提供setter方法就必須使用構(gòu)造器注入
6、自己開發(fā)的模塊推薦使用setter注入
到此這篇關(guān)于Spring依賴注入(DI)兩種方式的示例詳解的文章就介紹到這了,更多相關(guān)Spring依賴注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring mvc 組合mybatis框架實(shí)例詳解
本項(xiàng)目采用 maven 結(jié)構(gòu),主要演示了 spring mvc + mybatis,controller 獲取數(shù)據(jù)后以json 格式返回?cái)?shù)據(jù)。對(duì)spring mvc 組合mybatis的方法感興趣的朋友可以參考下本文2018-01-01
Java用freemarker導(dǎo)出word實(shí)用示例
本篇文章主要介紹了Java用freemarker導(dǎo)出word實(shí)用示例,使用freemarker的模板來實(shí)現(xiàn)功能,有需要的可以了解一下。2016-11-11
Java實(shí)現(xiàn)Dbhelper支持大數(shù)據(jù)增刪改
這篇文章主要介紹了Java實(shí)現(xiàn)Dbhelper支持大數(shù)據(jù)增刪改功能的實(shí)現(xiàn)過程,感興趣的小伙伴們可以參考一下2016-01-01
解決使用IDEA時(shí)跳轉(zhuǎn)到.class的問題
這篇文章主要介紹了解決使用IDEA時(shí)跳轉(zhuǎn)到.class的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
解決@ServerEndpoint不能注入@Autowired的問題
這篇文章主要介紹了解決@ServerEndpoint不能注入@Autowired的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
Java中DateTimeFormatter的使用方法和案例
在Java中,DateTimeFormatter類用于格式化和解析日期時(shí)間對(duì)象,它是日期時(shí)間格式化的強(qiáng)大而靈活的工具,本文將和大家一起探討Java中DateTimeFormatter的使用方法和案例,需要的朋友可以參考下2023-10-10
javaWeb實(shí)現(xiàn)簡(jiǎn)單文件上傳
這篇文章主要為大家詳細(xì)介紹了JAVAWeb實(shí)現(xiàn)簡(jiǎn)單文件上傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06

