日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

說起spring的注入,可能大家都有了解。可你認(rèn)知幾種注入方式呢?你所認(rèn)知的注入方式是否正確呢?我估計大多數(shù)人了解注入方式不全面,并且還會曲解一些概念。今天我們就參考最權(quán)威的官網(wǎng)來具體談?wù)剆pring的注入方式。

這里想給大家復(fù)習(xí)一下Spring的基礎(chǔ)知識,對于后續(xù)理解有很大幫助

IOC&&DI

想必關(guān)于這兩個概念大家不會陌生,面試題經(jīng)常會出現(xiàn)的。這里我們就從官網(wǎng)詳細(xì)文檔看一看。

spring的注入你真搞懂了嗎?不會一直都是這樣錯誤理解吧?

 

詳細(xì)的翻譯具體概念我就不講了,在這我只說出自己的理解

其實IOC也被稱為DI,因為在spring中IOC作用就是不需要程序員來手動創(chuàng)建和管理JAVA類,而是由spring容器自動實例化Bean對象。怎么個IOC呢,其實就是通過DI(依賴注入)實現(xiàn)的。

補充一點關(guān)于spring的bean對象(后面簡稱bean)
其實bean對象就是java對象,不同的在于Bean對象是由spring創(chuàng)建管理對象。
bean對象 是 java對象,但java對象 不一定是 bean對象

spring的注入你真搞懂了嗎?不會一直都是這樣錯誤理解吧?

 


我們的業(yè)務(wù)類,經(jīng)過spring容器DI添加源數(shù)據(jù)從而生成一個Bean對象可以被使用。這也就是spring IOC容器的運行流程圖。

Configuration Metadata(IOC)

關(guān)于配置元數(shù)據(jù),spring官方文檔給出了三種配置方式

  1. XML-based metadata 1.0版本
  2. Annotation-based configuration 2.5版本
  3. Java-based configuration 3.0版本

雖說三種,但其實我接觸也只有前兩種。本文也是關(guān)于前兩種詳細(xì)介紹。

基于 XML 的 bean 注入方式

xml手動配置bean (自動裝配可以通過set方法自動創(chuàng)建pojo類對象加上元數(shù)據(jù)信息構(gòu)造成bean對象)

基于 XML 的 bean 注入方式的實現(xiàn)有三種方法:

  1. xml配置ref
  2. 屬性 setter方法注入(或設(shè)值注入)
  3. 構(gòu)造方法注入

在基于 XML 的 bean 裝配中,我們需要了解一下自動注入模型

spring的注入你真搞懂了嗎?不會一直都是這樣錯誤理解吧?

 

關(guān)于自動模型官網(wǎng)上解釋說:當(dāng)使用基于xml的注入方式時,可以指定自動連接模式
也就是說spring 的自動注入的模型 (僅僅針對xml-based配置)
使用java,annotation另外兩種注入方式?jīng)]有注入模型

Autowiring Collaborators(自動注入的模型)

spring的注入你真搞懂了嗎?不會一直都是這樣錯誤理解吧?

 

  1. no :(默認(rèn))沒有自動裝配。Bean引用必須由ref元素定義。
  2. byname:通過名稱查找bean自動裝配屬性。
  3. bytype:通過類型找bean,根據(jù)set或者構(gòu)造方法注入
  4. construct 推斷構(gòu)造方法 通過構(gòu)造方法自動配置,如果多個構(gòu)造方法選擇多個參數(shù)的構(gòu)造方法

Annotation-based configuration(注解注入)

@Autowired和@Resource兩個注解實現(xiàn)。面試題中也經(jīng)常會問到兩個注解的區(qū)別,我搜索網(wǎng)上的答案卻講的是@Autowired是通過bytype,@Resource是通過byname。但這種理解顯然是錯誤的,因為關(guān)于自動模型文章前面也已經(jīng)說過 官網(wǎng):當(dāng)使用基于xml的注入方式時,可以指定自動連接模式

@Autowired和@Resource只不過是通過type,name去查找,而不是bytype以及byname模式。有什么區(qū)別?
區(qū)別在于byname通過名字找bean自動填充–>沒找到就會報錯
bytype通過類型去找bean自動填充–>沒找到就會報錯

1. @Autowired:type --> name --> error
不僅僅通過type找。type找不到,還可以通過name找。都找不到才會報錯
spring包中的AutowiredAnnotationBeanPostProcessor.java中的一個方法實現(xiàn)解析的
2. @Resource:name --> type --> error
不僅僅通過name找。name找不到,還可以通過type找。都找不到才會報錯
javax中的 commonAnnotationBeanPostProcessor.java中的一個方法實現(xiàn)解析的

這里再強調(diào)一下:
注解 無關(guān)注入的模型(no,byname,bytype,constract)

怎么說?還相信網(wǎng)上的知識點嗎?不相信我說的?那可以我們還是來用code證明。

Talk is cheap,show you my code

準(zhǔn)備階段

spring的注入你真搞懂了嗎?不會一直都是這樣錯誤理解吧?

 

  1. 創(chuàng)建一個spring項目
  2. 創(chuàng)建Appconfig類以及test類
  3. 創(chuàng)建幾個service類

Appconfig.java

package services;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.ComponentScan;
@Configurable
@ComponentScan("com.shadow")
public class Appconfig {

Test.java

package test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
    public static void main(String[] args) {
//        AnnotationConfigApplicationContext ac =
//                new AnnotationConfigApplicationContext(Appconfig.class);
        ClassPathXmlApplicationContext cc = new ClassPathXmlApplicationContext("web.xml");
    }
}

其余都為空

基于 XML 的 bean 注入方式

no方式配置

GoudanService.java

package services;
public class GoudanService {
    GouService gouService;    public void setGouService(GouService gouService) {
        this.gouService = gouService;
    }    public GouService getGouService() {
        return gouService;
    }}

web.xml

<bean id="goudanBean" class="services.GoudanService">
        <property name="gouService">
            <ref bean="gouBean"></ref>
        </property>
    </bean>
    <bean id="gouBean" class="services.GouService">
    </bean>

Test.java

package test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import services.GoudanService;
public class Test {
    public static void main(String[] args) {
//        AnnotationConfigApplicationContext ac =
//                new AnnotationConfigApplicationContext(Appconfig.class);
        ClassPathXmlApplicationContext cc = new ClassPathXmlApplicationContext("web.xml");
        System.out.println(cc.getBean(GoudanService.class).getGouService());
    }
}

運行Test.java的result

spring的注入你真搞懂了嗎?不會一直都是這樣錯誤理解吧?

 

想要在GoudanService中配置GouService,我們采用xml配置方式的no注入模型。雖然我們沒有配置注入模型參數(shù)但是xml默認(rèn)是no。故所以我們運行Test.java得出結(jié)果是配置成功的。

spring的注入你真搞懂了嗎?不會一直都是這樣錯誤理解吧?

 


我把xml這一段注釋掉呢?
根據(jù)no注入模型的官網(wǎng)解釋,大家應(yīng)該知道這是無法自動配置的,也就是null。

spring的注入你真搞懂了嗎?不會一直都是這樣錯誤理解吧?

 

bytype方式配置

GoudanService.java

package services;
public class GoudanService {
    GouService gouService;    public void setGouService(GouService gouService) {
        this.gouService = gouService;
    }    public GouService getGouService() {
        return gouService;
    }}

web.xml

spring的注入你真搞懂了嗎?不會一直都是這樣錯誤理解吧?

 

	<bean id="goudanBean" class="services.GoudanService">
	    </bean>
    <bean id="gouBean" class="services.GouService">
    </bean>

Test.java

package test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import services.GoudanService;
public class Test {
    public static void main(String[] args) {
//        AnnotationConfigApplicationContext ac =
//                new AnnotationConfigApplicationContext(Appconfig.class);
        ClassPathXmlApplicationContext cc = new ClassPathXmlApplicationContext("web.xml");
        System.out.println(cc.getBean(GoudanService.class).getGouService());
    }
}

運行Test.java的result

spring的注入你真搞懂了嗎?不會一直都是這樣錯誤理解吧?

 

我們發(fā)現(xiàn)bytype模型注入,與no方式注入想比不需要了bean里配置property的ref,spring容器會自動根據(jù)GouService的類型去找bean,結(jié)果找到了類型為:services.GouService的bean,所以也是可以配置成功的。

重點:bytype就是如果屬性類型與bean的class類型相同那么可以自動配置,否則配置錯誤。看下面圖

spring的注入你真搞懂了嗎?不會一直都是這樣錯誤理解吧?

 


spring的注入你真搞懂了嗎?不會一直都是這樣錯誤理解吧?

 

byname方式配置

GoudanService.java

package services;
public class GoudanService {
    GouService gouService;    GouService gouBean;    public GouService getGouBean() {
        return gouBean;
    }    public void setGouBean(GouService gouBean) {
        this.gouBean = gouBean;
    }    public void setGouService(GouService gouService) {
        this.gouService = gouService;
    }    public GouService getGouService() {
        return gouService;
    }}

web.xml

spring的注入你真搞懂了嗎?不會一直都是這樣錯誤理解吧?

 

	<bean id="goudanBean" class="services.GoudanService">
	    </bean>
    <bean id="gouBean" class="services.GouService">
    </bean>

Test.java

package test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import services.GoudanService;
public class Test {
    public static void main(String[] args) {
//        AnnotationConfigApplicationContext ac =
//                new AnnotationConfigApplicationContext(Appconfig.class);
        ClassPathXmlApplicationContext cc = new ClassPathXmlApplicationContext("web.xml");
//        System.out.println(cc.getBean(GoudanService.class).getGouService());
        System.out.println(cc.getBean(GoudanService.class).getGouBean());
    }
}

運行Test.java的result

spring的注入你真搞懂了嗎?不會一直都是這樣錯誤理解吧?

 

我們發(fā)現(xiàn)byname模型注入,與no方式注入想比不需要了bean里配置property的ref,spring容器會自動根據(jù)GouService定義屬性名稱去找bean的名稱,結(jié)果找到了id名稱為:gouBean的bean,所以也是可以配置成功的。

byname就是如果屬性名稱與bean的id名稱相同那么可以自動配置,否則配置錯誤。

construct方式配置

GoudanService.java

package services;
public class GoudanService {
    GouService gouService;
    GouService gouBean;    //構(gòu)造方法1
    GoudanService(GouService gouBean){        this.gouBean=gouBean;    }//    //構(gòu)造方法2
//    GoudanService(GouService gouService){
//        this.gouService=gouService;
//    }
//    //構(gòu)造方法3
//    GoudanService(GouService gouService,GouService gouBean){
//        this.gouService=gouService;
//        this.gouBean=gouBean;
//    }
    
    public GouService getGouBean() {
        return gouBean;
    }
    public GouService getGouService() {
        return gouService;
    }
//    public void setGouBean(GouService gouBean) {
//        this.gouBean = gouBean;
//    }
//    public void setGouService(GouService gouService) {
//        this.gouService = gouService;
//    }
}

web.xml

spring的注入你真搞懂了嗎?不會一直都是這樣錯誤理解吧?

 

	<bean id="goudanBean" class="services.GoudanService">
	    </bean>
    <bean id="gouBean" class="services.GouService">
    </bean>

Test.java

package test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import services.GoudanService;
public class Test {
    public static void main(String[] args) {
//        AnnotationConfigApplicationContext ac =
//                new AnnotationConfigApplicationContext(Appconfig.class);
        ClassPathXmlApplicationContext cc = new ClassPathXmlApplicationContext("web.xml");
        System.out.println(cc.getBean(GoudanService.class).getGouService());
        System.out.println(cc.getBean(GoudanService.class).getGouBean());
    }
}

分別運行構(gòu)造方法1,2,3三次,注釋掉其他兩種構(gòu)造方法
運行Test.java的result

構(gòu)造方法1

spring的注入你真搞懂了嗎?不會一直都是這樣錯誤理解吧?

 

構(gòu)造方法2

spring的注入你真搞懂了嗎?不會一直都是這樣錯誤理解吧?

 

構(gòu)造方法3

spring的注入你真搞懂了嗎?不會一直都是這樣錯誤理解吧?

 

我們發(fā)現(xiàn)construct模型注入,它既可以通過name注入也可以通過type注入。

Annotaton-based configuration(注解注入方式)

@Autowired

在這里,很多人網(wǎng)上說@Autowired是通過bytype查找,但其實這種說法有些許的不嚴(yán)謹(jǐn)。
1.自動注入模型是基于xml的bean注入方式。
2.bytype模型是只要通過類型查找,如果找不到,或者找到兩個相同的類型bean就會報錯
3.而@Autowired是通過類型去找,找不到還會通過名稱去找

@Resource

而@Resource是通過byname查找,這種說法和@Autowired相似也是不嚴(yán)謹(jǐn)?shù)摹?br />byname模型是只要通過名稱查找,如果找不到報錯而@Resource是通過名稱去找,找不到還會通過類型去找,不單單只限于通過name去查找。

區(qū)別

  1. @Autowired type --> name --> error
    spring包中的AutowiredAnnotationBeanPostProcessor.java中的一個方法實現(xiàn)解析的
  2. @Resource name --> type --> error
    javax中的 commonAnnotationBeanPostProcessor.java中的一個方法實現(xiàn)解析的

來源:https://blog.csdn.net/qq_40994080/article/details/108090104?utm_medium=distribute.pc_category.none-task-blog-hot-2.nonecase&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-2.nonecase&request_id=

分享到:
標(biāo)簽:注入 spring
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達(dá)人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定