詳解Spring中bean實(shí)例化的三種方式
今天我想來(lái)說(shuō)說(shuō)如何通過(guò)xml配置來(lái)實(shí)例化bean,其實(shí)也很簡(jiǎn)單。
使用xml配置來(lái)實(shí)例化bean共分為三種方式,分別是普通構(gòu)造方法創(chuàng)建、靜態(tài)工廠創(chuàng)建、實(shí)例工廠創(chuàng)建,OK,那么接下來(lái)我們來(lái)分別看看這幾種方式。
普通構(gòu)造方法創(chuàng)建
這種創(chuàng)建方式使我們使用最多的一種創(chuàng)建方式,直接配置bean節(jié)點(diǎn)即可,比如我有一個(gè)User類,如下:
public class User {
public void add() {
System.out.println("add()---------");
}
}
然后通過(guò)簡(jiǎn)單配置一個(gè)bean節(jié)點(diǎn)就可以獲取實(shí)例了,如下:
<bean class="org.sang.User" id="user"/>
OK,我們通過(guò)如下代碼進(jìn)行一個(gè)簡(jiǎn)單的測(cè)試:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user");
System.out.println(user);
運(yùn)行輸出結(jié)果如下:

靜態(tài)工廠創(chuàng)建
除了通過(guò)普通的構(gòu)造方法創(chuàng)建之外,我們也可以通過(guò)靜態(tài)構(gòu)造方法來(lái)創(chuàng)建一個(gè)bean的實(shí)例,假設(shè)我有一個(gè)類叫做User2,如下:
public class User2 {
public void add() {
System.out.println("add2()---------");
}
}
我給它創(chuàng)建一個(gè)靜態(tài)工廠,如下:
public class User2Factory {
public static User2 getInstance() {
return new User2();
}
}
該工廠中有一個(gè)靜態(tài)方法,該靜態(tài)方法返回一個(gè)User2的實(shí)例,在Spring的配置文件中,我們看看如何生成User2的實(shí)例:
<bean id="user2" class="org.sang.User2Factory" factory-method="getInstance"/>
還是bean節(jié)點(diǎn),只是多了一個(gè)factory-method屬性,該屬性指明該類中的靜態(tài)工廠方法名為getInstance,這樣Spring框架就知道調(diào)用哪個(gè)方法來(lái)獲取User2的實(shí)例了,測(cè)試代碼如下:
@Test
public void test2() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User2 user = (User2) context.getBean("user2");
user.add();
}
測(cè)試結(jié)果如下:

值得強(qiáng)調(diào)的是,這種方法并不常用。
實(shí)例工廠創(chuàng)建
小伙伴們看了靜態(tài)工廠創(chuàng)建bean實(shí)例肯定都覺得很麻煩,事實(shí)上還有比靜態(tài)工廠更麻煩的寫法,那就是通過(guò)實(shí)例工廠來(lái)創(chuàng)建bean實(shí)例。實(shí)例工廠,顧名思義,就是我們工廠中的方法不是靜態(tài)的,比如說(shuō),我有一個(gè)實(shí)體類叫做User3,如下:
public class User3 {
public void add() {
System.out.println("add3()---------");
}
}
然后我還有一個(gè)工廠方法,如下:
public class User3Factory {
public User3 getUser3() {
return new User3();
}
}
小伙伴們看到,在User3Factory類中有一個(gè)getUser3的方法,該方法返回一個(gè)User3類的實(shí)例,但是該方法不是靜態(tài)的,那么我們?cè)赟pring的配置文件中要進(jìn)行怎樣的配置才能獲取User3的一個(gè)實(shí)例呢?如下:
<bean class="org.sang.User3Factory" id="user3Factory"/> <bean id="user3" factory-bean="user3Factory" factory-method="getUser3"/>
第一個(gè)bean用來(lái)獲取user3Factory的實(shí)例,第二個(gè)bean則根據(jù)User3Factory的實(shí)例,然后指定factory-method,通過(guò)getUser3方法來(lái)獲取User3的實(shí)例。
測(cè)試代碼如下:
@Test
public void test3() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User3 user = (User3) context.getBean("user3");
user.add();
}
測(cè)試結(jié)果如下:

OK,以上就是bean實(shí)例化的三種方式,最最常用的是第一種。
本文案例GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test28-Spring1
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring?Boot中@Import三種使用方式實(shí)例詳解
這篇文章主要介紹了Spring?Boot中@Import三種使用方式,主要有引入普通類,引入importSelector的實(shí)現(xiàn)類及引入importBeanDefinitionRegister的實(shí)現(xiàn)類,結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2022-11-11
SpringBoot跨域Access-Control-Allow-Origin實(shí)現(xiàn)解析
這篇文章主要介紹了SpringBoot跨域Access-Control-Allow-Origin實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
org.apache.zookeeper.KeeperException.BadVersionException異常的解
在使用Apache ZooKeeper進(jìn)行分布式協(xié)調(diào)時(shí),你可能會(huì)遇到org.apache.zookeeper.KeeperException.BadVersionException異常,本文就來(lái)介紹一下解決方法,感興趣的可以了解一下2024-03-03
Mybatis查詢Sql結(jié)果未映射到對(duì)應(yīng)得實(shí)體類上的問題解決
使用mybatis查詢表數(shù)據(jù)得時(shí)候,發(fā)現(xiàn)對(duì)應(yīng)得實(shí)體類字段好多都是null,本文主要介紹了Mybatis查詢Sql結(jié)果未映射到對(duì)應(yīng)得實(shí)體類上的問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02

