Spring的屬性注入是如何執行的?

2021-10-06 05:37:31 字數 1658 閱讀 6226

public class userserviceimpl 

public void setschoolservice(schoolserviceimpl schoolservice)

}

第一種方式:

這裡通過set方法將schoolserviceimpl注入到userserviceimpl中,userservice.xml檔案配置

<?xml version="1.0" encoding="utf-8"?>

debug發現:

當userserviceimpl被建立完畢之後,會進入populatebean這個方法,它負責填充bean屬性,userserviceimpl中的屬性就是schoolserviceimpl,

以上步驟相當於:

建立a->建立完畢->填充a屬性,b->發現b快取中沒有對應的例項->建立b、填充b屬性、例項化b->將例項化好的b設定到a中的屬性b中->例項化a->完畢

思考:

有沒有可能當userserviceimpl需要注入schoolserviceimpl的時候,schoolserviceimpl已經準備好的時候?

要搞清楚這個問題,就要知道幾個關鍵點:

1、當getbean(beanname)時候,只要getsingleton(beanname)能獲取到schoolserviceimpl,那麼就不會建立,getsingleton裡負責找bean的map是在getbean方法執行中,put進去的

2、也就是說,schoolserviceimpl要比userserviceimpl更早的呼叫getbean(beanname)方法,而呼叫順序是beandefinitionnames裡的元素順序決定的

3、beandefinitionnames裡的元素是什麼時候放進去的?就是解析xml的時候,解析xml檔案也是從上到下、迴圈解析。所以,只要將schoolserviceimpl的bean標籤放到userserviceimp之前就行了。

第二種方式:構造器方法

public class userserviceimpl 

public string getschoolservicemethod()

}

<?xml version="1.0" encoding="utf-8"?>

構造器和set方法執行流程一點點不同,當getbean(beanname)最終createbeaninstance的時候,此時會呼叫autowireconstructor方法,->resolveconstructorarguments->resolvevalueifnecessary,最終還是會呼叫這個方法,由於建立例項的時候,呼叫建構函式,this.schoolserviceimpl = schoolserviceimpl 算是提前把屬性填充好了,所以再呼叫populatebean這個方法時,基本沒什麼可執行的**,此時在這個方法裡面是沒做任何事情的。它不像set方法注入,最終會呼叫方法。它不執行任何方法

以上步驟相當於:

建立a->發現a具有構造器,使用**中的構造器進行建立a->建立a的構造器引數是b,此時**把b設定到a的屬性b上->a建立完畢->填充屬性->例項化->完畢

更多詳細使用或者原理,可參考spring官方文件對於依賴注入的文件部分

spring屬性的注入例項

spring框架核心jar包 在工作目錄下建立spring配置檔案 xmlns xmlns xsi xmlns jee xmlns aop xmlns jdbc xmlns tx xmlns jpa xmlns context xsi schemalocation spring beans 3.1....

四 Spring的屬性注入

一 bean屬性注入 1 構造方法的方式注入屬性 id car class cn.itcast.spring.demo4.car name name value 保時捷 name price value 1000000 bean 2 set 方法的方式注入屬性 id car2 class cn.it...

spring 注入屬性的值

1 注入屬性的值 重要 1.1 基本概念 以某個 user 類為例 public class user 然後,在spring的配置檔案中,將 節點寫成成對的標籤,並新增 子節點 如果有多個屬性需要注入值,則每個屬性都需要有set方法,並且,在 下使用多個 節點進行配置。注意 在配置 節點時,其中的 ...