第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

Spring DI(依賴注入)之XML配置

1.前言

在第二個(gè)整個(gè)大章節(jié),我們?cè)敿?xì)講解了 控制反轉(zhuǎn),也就是對(duì) bean 做實(shí)例化的部分。而我們知道 ,Spring 的核心功能是兩個(gè):控制反轉(zhuǎn) 和 依賴注入。

那么控制反轉(zhuǎn)我們已經(jīng)講過(guò),而依賴注入是什么呢?

各位看官,隨小可一起來(lái)…

2. 依賴注入案例

2.1概念介紹

知識(shí)回顧

對(duì)于依賴注入,我們?cè)诘谝徽碌谝还?jié)已經(jīng)介紹過(guò),我們回顧一下

圖片描述

概念解釋

上面是我們之前對(duì)于依賴注入的一個(gè)通俗解釋。那么這里再著重強(qiáng)調(diào)一下 IOC 控制反轉(zhuǎn)與 DI 依賴注入的關(guān)系:

IOC 控制反轉(zhuǎn)是將對(duì)象實(shí)例化的動(dòng)作交由了 Spring 框架, 它的作用是降低了程序的耦合,不需要我們手動(dòng)的創(chuàng)建對(duì)象,但是程序的耦合性還是存在。

對(duì)象中肯定會(huì)有一些其余對(duì)象的引用,那么這種引用就稱呼為對(duì)象的依賴,而 DI 依賴注入其實(shí) 是 IOC 設(shè)計(jì)思想的一種表現(xiàn)形式。

對(duì)于 這種屬性依賴,我們無(wú)需手動(dòng)賦予,也是講賦值的動(dòng)作交給 Spring ,那么這種操作就是 依賴注入。

依賴注入方式

  • 第一種方式是通過(guò) xml 配置的方式實(shí)現(xiàn);
  • 第二種方式是在屬性或者方法上使用注解的方式實(shí)現(xiàn)。

那么,本章節(jié)先帶大家體驗(yàn)下 xml 方式實(shí)現(xiàn)依賴注入。

2.2 工程實(shí)現(xiàn):

搭建動(dòng)作介紹

  1. 創(chuàng)建一個(gè) maven 工程
  2. 導(dǎo)入Spring 使用的依賴
  3. 編寫(xiě)業(yè)務(wù)層的 Service 和持久層的 Dao java 類
  4. 編寫(xiě) Spring 的配置文件

創(chuàng)建工程 導(dǎo)入依賴 省略

可以參考之前創(chuàng)建過(guò)的IOC工程

java 代碼

創(chuàng)建 Servcie 的接口和接口的實(shí)現(xiàn)類,代碼如下:

//接口代碼
public interface UserService {
    
    public void deleteById(Integer id);
}
//實(shí)現(xiàn)類代碼
public class UserServiceImpl implements UserService {

    private UserDao userDao;

    public UserDao getUserDao() {
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void deleteById(Integer id) {

        System.out.println("刪除的方法執(zhí)行");
    }

}

UserDao 接口和實(shí)現(xiàn)類代碼:

//dao接口代碼
public interface UserDao {

}
//dao實(shí)現(xiàn)類代碼
public class UserDaoImpl implements UserDao {
}

代碼解釋: dao的接口和實(shí)現(xiàn)類中并沒(méi)有方法,只是為了測(cè)試 作為service中的屬性依賴,可以實(shí)現(xiàn)由 Spring 完成動(dòng)態(tài)注入。

重點(diǎn)來(lái)了:spring 的核心配置文件:

圖片描述

配置解釋:

在上面的配置文件中:

  • bean 標(biāo)簽是描述一個(gè)被實(shí)例化的類 而 property 則表示一類中的屬性
  • property 標(biāo)簽中的屬性 name 一般我們寫(xiě)成類中的屬性名稱, 實(shí)際上,起決定作用的并不是屬性名,下面示例再展示
  • ref 表示當(dāng)前的屬性 是一個(gè)引用對(duì)象,而引用的是誰(shuí)呢? ref 中的值 必須是在容器中已經(jīng)實(shí)例化的一個(gè)引用對(duì)象的唯一標(biāo)識(shí)。
  • value 當(dāng)前的屬性可以直接賦值,所以通過(guò) value 中,填寫(xiě)要賦予的數(shù)值即可

測(cè)試結(jié)果

圖片描述

代碼解釋

可以看到 我們得到了 service 中的類屬性 Userdao 的實(shí)例,并且也 得到了 字符串屬性 userName的值 zs

2.3 property注入屬性的解釋

剛剛我們?cè)谏厦娴氖纠?展示了xml依賴屬性的注入,也是比較好理解。

這里我們強(qiáng)調(diào)一下使用的注意事項(xiàng):

如果是 property 屬性標(biāo)簽實(shí)現(xiàn)屬性注入,那么類中必須由配置在 property 標(biāo)簽中 name 屬性的 set 方法

下面我們測(cè)試一下set方法的改變:

先講 service 中 dao 的 set 方法改造如下:

public void setDao(UserDao userDao) {
    System.out.println("執(zhí)行了set方法 給dao屬性賦值");
    this.userDao = userDao;
}

這時(shí)候代碼中的set方法變成了 setDao 配置文件不變,依然是

<property name="userDao" ref="userDao"></property>

我們看看會(huì)產(chǎn)生什么問(wèn)題


Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'userDao' of bean class [com.wyan.service.UserServiceImpl]: Bean property 'userDao' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
	at org.springframework.beans.BeanWrapperImpl.createNotWritablePropertyException(BeanWrapperImpl.java:247)
	at org.springframework.beans.AbstractNestablePropertyAccessor.processLocalProperty(AbstractNestablePropertyAccessor.java:426)
	at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:278)
	at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:266)
	at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:97)
	at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:77)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1646)

可以看到異常的堆棧信息 無(wú)效的 userDao 屬性, userDao 不可以 或者 沒(méi)有有效的 setter 方法提供。

更改xml文件中的 property 標(biāo)簽的 name 屬性 為 dao

<property name="dao" ref="userDao"></property>

測(cè)試結(jié)果如下:

圖片描述
所以我們說(shuō) property 中的 name 屬性不一定要跟 Java類中的屬性名保持一致 而是必須跟 setter 方法的名稱一致

3.總結(jié):

本章節(jié)重點(diǎn)依賴注入的 xml 實(shí)現(xiàn)

  1. 依賴注入 實(shí)際上是 IOC 設(shè)計(jì)思想的一種具體實(shí)現(xiàn)
  2. 依賴注入 可以通過(guò) xml 配置實(shí)現(xiàn) ,可以通過(guò)注解實(shí)現(xiàn)
  3. xml 的依賴注入 是依托于類中的 set 方法實(shí)現(xiàn)的。

不積跬步無(wú)以至千里,不積小流無(wú)以成江?!^續(xù)努力