最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring中的自動(dòng)裝配機(jī)制詳解

 更新時(shí)間:2023年08月16日 09:58:26   作者:猿小許  
這篇文章主要介紹了Spring中的自動(dòng)裝配機(jī)制詳解,自動(dòng)裝配就是會(huì)通過(guò)Spring的上下文為你找出相應(yīng)依賴項(xiàng)的類,通俗的說(shuō)就是Spring會(huì)在上下文中自動(dòng)查找,并自動(dòng)給Bean裝配與其相關(guān)的屬性,需要的朋友可以參考下

一、什么是自動(dòng)裝配?

自動(dòng)裝配就是會(huì)通過(guò)Spring的上下文為你找出相應(yīng)依賴項(xiàng)的類,通俗的說(shuō)就是Spring會(huì)在上下文中自動(dòng)查找,并自動(dòng)給Bean裝配與其相關(guān)的屬性!

spring中實(shí)現(xiàn)自動(dòng)裝配的方式有兩種,一種是通過(guò)xml文件、一種是通過(guò)注解的方式。

下面為大家介紹這兩種方式實(shí)現(xiàn)自動(dòng)裝配。

為了更簡(jiǎn)單的讓大家理解,我們通過(guò)例子來(lái)說(shuō)明: 有以下三個(gè)實(shí)體類,People類,Dog類,Cat類,分別代表人、狗、貓。

人養(yǎng)了一只狗和一只貓,貓和狗都會(huì)叫。

public class Cat {
    public void shout(){
        System.out.println("miao~");
    }
}
public class Dog {
    public void shout(){
        System.out.println("wang wang~");
    }
}
public class Peopel {
    private Cat cat;
    private Dog dog;
    private String name;
    Setter/Getter...

二、手動(dòng)裝配

講自動(dòng)裝配之前,我們先來(lái)說(shuō)一下手動(dòng)裝配,手動(dòng)裝配又是什么?

手動(dòng)裝配就是通過(guò)xml配置自己將bean中所關(guān)聯(lián)的其他bean裝配進(jìn)去。

用代碼表示:

<?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="cat" class="com.kuang.pojo.Cat"/>
    <bean id="dog" class="com.kuang.pojo.Dog"/>
    <bean id="people" class="com.kuang.pojo.Peopel">
        <property name="name" value="張三"/>
        <property name="cat" ref="cat"/>
        <property name="dog" ref="dog"/>
    </bean></beans>

在id=people的bean(以后id=xx的bean我們就叫xxBean)中,我們給peopleBean手動(dòng)裝配了與之關(guān)聯(lián)的catBean和dogBean,這就叫做手動(dòng)裝配。

那么有沒(méi)有什么辦法,我們可以不用去手動(dòng)裝配關(guān)聯(lián)的bean,讓spring幫我們自動(dòng)把關(guān)聯(lián)的bean裝配進(jìn)去呢?答案是肯定的。

自動(dòng)裝配就可以幫助我們解決這個(gè)問(wèn)題。

實(shí)現(xiàn)自動(dòng)裝配有兩種方式。一種是使用注解的方式、另一種是通過(guò)xml文件的方式。

下面我們倆講實(shí)現(xiàn)自動(dòng)裝配的兩種方式。

三、自動(dòng)裝配

3.1 通過(guò)xml文件實(shí)現(xiàn)自動(dòng)裝配

我們只需要在xml配置文件中的bean標(biāo)簽中加入一個(gè)屬性autowire即可,例如:

<bean id="people" class="com.kuang.pojo.Peopel" autowire="byName">
        <property name="name" value="張三"/>
</bean>

使用autowire關(guān)鍵字聲明bean的自動(dòng)裝配方式。

其可選值為byName、byType、constructor,default,no;

這里講前邊兩個(gè)。

3.1.1 byName

設(shè)置autowire屬性為byName,那么Spring會(huì)根據(jù)class屬性找到實(shí)體類,然后查詢實(shí)體類中所有setter方法的名字,根據(jù)setter方法后面的名字(例如SetDog,則setter方法后面的名字為dog)再到配置文件中尋找一個(gè)與該名字相同id的Bean,注入進(jìn)來(lái)。如圖:

在這里插入圖片描述

3.1.2 byType

設(shè)置autowire屬性為byType,那么Spring會(huì)自動(dòng)尋找一個(gè)與該屬性類型相同的Bean,注入進(jìn)來(lái)。

在這里插入圖片描述

*注意:使用byType這種方式,必須保證配置文件中所有bean的class屬性的值是唯一的,否則就會(huì)報(bào)錯(cuò)

例如:下邊這種方式是錯(cuò)誤的,因?yàn)閮蓚€(gè)bean中的class屬性的值重復(fù)了,會(huì)報(bào)錯(cuò)

在這里插入圖片描述

3.2 通過(guò)注解實(shí)現(xiàn)自動(dòng)裝配

注解是通過(guò)反射來(lái)實(shí)現(xiàn)的。

3.2.1 使用注解前的準(zhǔn)備:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
    <context:annotation-config/>
</beans>

注意: conteext:annotation-config/ 必須要寫在xml中,這是用來(lái)開(kāi)啟注解的支持,如果不加上注解就無(wú)效。

3.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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
    <context:annotation-config/>
    <bean id="cat" class="com.kuang.pojo.Cat"/>
    <bean id="dog" class="com.kuang.pojo.Dog"/>
    <bean id="people" class="com.kuang.pojo.Peopel">
        <property name="name" value="張三"/>
    </bean>
</beans>

然后在實(shí)體類的對(duì)應(yīng)屬性上添加@Autowired注解(也可以把注解放到對(duì)應(yīng)屬性的setter上),people類中依賴Dog類和Cat類。

所以在people類中的dog和cat屬性上要加上@Autowired,實(shí)現(xiàn)自動(dòng)裝配。

public class Peopel {
    @Autowired
    private Cat cat;
    @Autowired
    private Dog dog;
    private String name;
    setter/getter... 
}

3.3 重點(diǎn)

(1)注解方法裝配屬性的過(guò)程:spring會(huì)默認(rèn)優(yōu)先根據(jù)(被注解修飾的)屬性類型去容器中找對(duì)應(yīng)的組件(bean),找到就賦值;若找到多個(gè)相同類型的組件,再將屬性的名稱作為組件(bean)的id去容器中查找。

(2)@Qualifier注解可以和使用Autowired搭配使用:@Qualifier指定需要裝配的組件的id,而不是使用屬性名。

例如下邊例子,spring就會(huì)優(yōu)先在容器中查找id為“cat”的組件。

public class Peopel {
    @Autowired
    @Qualifier(value = "cat")
    private Cat cat;
}

什么情況會(huì)使用到@Qualifier注解:當(dāng)ioc容器根據(jù)屬性類型去容器中找找到多個(gè)相同類型的組件,再將屬性的名稱作為組件(bean)的id去容器中查找找不到時(shí)就是用這兩個(gè)注解搭配,指定需要裝配的bean的id。

(3)在默認(rèn)情況下使用 @Autowired 注釋進(jìn)行自動(dòng)注入時(shí),Spring 容器中匹配的候選 Bean 數(shù)目必須有且僅有一個(gè)。當(dāng)找不到一個(gè)匹配的 Bean 時(shí),Spring 容器將拋出 BeanCreationException 異常,并指出必須至少擁有一個(gè)匹配的 Bean。當(dāng)不能確定 Spring 容器中一定擁有某個(gè)類的 Bean 時(shí),可以在需要自動(dòng)注入該類 Bean 的地方可以使用@Autowired(required= false)。這等于告訴 Spring:在找不到匹配 Bean 時(shí)也不報(bào)錯(cuò)。

3.3.1 Resource注解【不常用】

@Resource:可以和@Autowired一樣實(shí)現(xiàn)自動(dòng)裝配功能

但是跟@Autowired不一樣的是,它默認(rèn)是按照組件名稱進(jìn)行裝配的,按照組件名稱找不到在根據(jù)屬性類型去查找再找不到就報(bào)錯(cuò);

他們另一個(gè)不同的地方就是@Autowired是Spring定義的;

@Resource是java規(guī)范。

到此這篇關(guān)于Spring中的自動(dòng)裝配機(jī)制詳解的文章就介紹到這了,更多相關(guān)Spring自動(dòng)裝配內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

双城市| 玉田县| 阜康市| 织金县| 隆昌县| 临邑县| 五莲县| 巴南区| 南部县| 高雄县| 淅川县| 梁山县| 松阳县| 邯郸市| 宜州市| 和林格尔县| 吉隆县| 大丰市| 得荣县| 佛山市| 乌拉特中旗| 象州县| 井研县| 芦溪县| 邢台市| 麦盖提县| 建湖县| 新昌县| 德格县| 武夷山市| 原阳县| 松滋市| 昌平区| 融水| 巴林左旗| 高淳县| 东源县| 平湖市| 宁国市| 东宁县| 长泰县|