例項化 Spring Bean 的幾種方式?

2021-10-09 05:31:52 字數 4491 閱讀 4782

1. 常規方式

通過構造器

建立 pojo 實體 user 類:

public

class

user

public

void

setid

(long id)

@override

public string tostring()';}

xml 檔案中配置 bean:

"user"

class

="org.test.spring.ioc.overview.domain.user"

>

"id" value=

"1"/

>

"name" value=

"彭于晏"

/>

<

/bean>

最後在主類中獲取 bean:

beanfactory beanfactory =

new(

"meta-inf/bean-instantiation-context.xml");

user user = beanfactory.

getbean

("user"

)system.out.

println

(user)

**執行結果如下所示:

通過靜態工廠方法

首先在 user 類中新增靜態函式:

public

static user createuser()

在 xml 檔案中配置該 bean:

<

!--靜態工廠方法例項化 bean --

>

"user-by-static-method"

class

="org.test.spring.ioc.overview.domain.user" factory-method=

"createuser"

/>

"use***ctory"

class

="org.test.spring.bean.factory.defaultuse***ctory"

/>

<

!--bean 工廠例項方法例項化 bean --

>

"user-by-instance-method" factory-bean=

"use***ctory" factory-method=

"createuser"

/>

<

!--factorybean 例項化 bean--

>

"user-by-factory-bean"

class

="org.test.spring.bean.factory.use***ctorybean"

/>

通過主函式類獲取該 bean:

beanfactory beanfactory =

new(

"meta-inf/bean-instantiation-context.xml");

user user = beanfactory.

getbean

("user-by-static-method"

, user.

class);

user userinstance = beanfactory.

getbean

("user-by-instance-method"

, user.

class);

user use***ctory = beanfactory.

getbean

("user-by-factory-bean"

, user.

class);

system.out.

println

(user)

; system.out.

println

(userinstance)

; system.out.

println

(use***ctory)

; system.out.

println

(user == userinstance)

; system.out.

println

(user == use***ctory)

;

通過 bean 工廠方法

首先 defaultuse***ctory 實現介面 use***ctory:

public

class

defaultuse***ctory

implements

use***ctory

其他類的實現方式看上面**哈

通過 factorybean

factorybean 的實現方式是定義乙個類實現官方 factorybean 介面:

public

class

use***ctorybean

implements

factorybean

@override

public class<

?>

getobjecttype()

}

其他方式上個樓看看

2.特殊方式

通過 serviceloade***ctorybean

首先,我們需要在 resources/meta-inf 目錄下建立 services 檔案下,同時建立以 use***ctory 路徑的文字檔案:

檔案中的內容為 use***ctory 的實現類 defaultuse***ctory 的路徑:

在 xml 檔案中配置 bean 標籤,其中 id 和 class 為官方指定的屬性,property 為 use***ctory:

"use***ctoryserviceloader"

class

="org.springframework.beans.factory.serviceloader.serviceloade***ctorybean"

>

"servicetype" value=

"org.test.spring.bean.factory.use***ctory"

/>

<

/bean>

然後就是主函式類,列印出該類:

new(

"meta-inf/special-bean-instantiation-context.xml");

serviceloader

use***ctoryserviceloader = beanfactory.

getbean

("use***ctoryserviceloader"

, serviceloader.

class);

iterator

iterator = use***ctoryserviceloader .

iterator()

;while

(iterator.

hasnext()

)通過 autowirecapablebeanfactory#createbean()

該種方式比較簡單,就是呼叫官方給的 api:

autowirecapablebeanfactory autowirecapablebeanfactory = beanfactory.

getautowirecapablebeanfactory()

;use***ctory bean = autowirecapablebeanfactory.

createbean

(defaultuse***ctory.

class);

system.out.

println

(bean.

createuser()

);

通過 beandefinitionregistry#registerbeandefinition()

該種方式比較簡單:具體**如下所示:

new();

register

(user.

class);

SPRING BEAN的例項化

3.2.3.2.2.使用靜態工廠方法例項化 當採用靜態工廠方法建立bean時,除了需要指定class屬性外,還需要通過factory method屬性來指定建立bean例項的工廠方法。spring將呼叫此方法 其可選引數接下來介紹 返回例項物件,就此而言,跟通過普通構造器建立類例項沒什麼兩樣。下面的...

Spring Bean的例項化

在物件導向的程式中,要想呼叫某個類的成員方法,就需要先例項化該類的物件。在spring中,例項化 bean 有三種方式,分別是構造器例項化 靜態工廠方式例項化和例項工廠方式例項化。本節將針對這三種方式分別進行講解。構造器例項化是指 spring 容器通過 bean 對應的類中預設的建構函式例項化 b...

spring bean何時例項化

lazy init 在getbean時例項化 2 非lazy的單例bean 容器初始化時例項化 3 prototype等 getbean時例項化 4 小時前 jinnianshilongnian 508013 4160 05 小時前 ddlgyq 30 0000 06 小時前 a123159521 ...