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 ...