Spring的IOC容器實例化bean的方式總結(jié)
IOC容器實例化bean的三種方式:構(gòu)造方法、靜態(tài)工廠、實例工廠。 本文章涉及工程目錄如下:

IOC容器實例化bean的三種方式
構(gòu)造方法
對象在new的時候通過構(gòu)造方法完成實例化。bean本質(zhì)是對象,也可以通過構(gòu)造方法完成實例化。
涉及代碼片。
// applicationContext.xml <bean id="flowService" class="com.lwb.services.impl.FlowServiceImpl">
// FlowServiceImpl.java
public class FlowServiceImpl implements FlowService {
private FlowServiceImpl(){
System.out.println(this.getClass() + "-----進(jìn)入FlowServiceImpl" +
"無參構(gòu)造器");
}
@Override
public void saveService() {
System.out.println(this.getClass() + "-----進(jìn)入FlowServiceImpl");
}
}
// App.java
public class App {
public static void main(String[] args){
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
}
執(zhí)行后返回結(jié)果:

思考:
1、構(gòu)造方法底層是通過反射機(jī)制實現(xiàn)的。注意上面無參構(gòu)造方法是private,只有反射才能訪問到私有方法。
2、底層使用的是無參構(gòu)造方法??梢詫懸粋€帶參的構(gòu)造方法進(jìn)行驗證,會報錯。
靜態(tài)工廠
涉及代碼片。
// applicationContext.xml
<!--靜態(tài)工廠實例化方法
class為靜態(tài)工廠類路徑,factory-method 為方法名
-->
<bean id="flowDao1" class="com.lwb.factory.FlowDaoStaticFactory" factory-method="getFlowDao"/>
// FlowDaoStaticFactory.java
//注意getFlowDao是static的,所以叫靜態(tài)工廠
public class FlowDaoStaticFactory {
public static FlowDao getFlowDao(){
System.out.println("-----進(jìn)入靜態(tài)工廠方法StaticFactory");
return new FlowDaoImpl();
}
}
// App.java
public class App {
public static void main(String[] args){
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
}
執(zhí)行后返回結(jié)果:

思考:
1、為什么使用靜態(tài)工廠方法,而不直接去new? 靜態(tài)工廠方法在返回new的對象實例之前,可以實現(xiàn)一些業(yè)務(wù)邏輯,如代碼中的日志輸出。
實例工廠
涉及代碼片。
// applicationContext.xml
<bean id="flowDaoExFactory" class="com.lwb.factory.FlowDaoExFactory"/>
<bean id="flowDao2" factory-method="getFlowDao" factory-bean="flowDaoExFactory"/>
// FlowDaoExFactory .java
//注意getFlowDao是public的,對比靜態(tài)工廠
public class FlowDaoExFactory {
public FlowDao getFlowDao(){
System.out.println(this.getClass() + "------進(jìn)入實例工廠類FlowDaoExFactory");
return new FlowDaoImpl();
}
}
// App.java
public class App {
public static void main(String[] args){
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
}
執(zhí)行后返回結(jié)果:

思考:
1、靜態(tài)工廠和實例工廠的區(qū)別?
靜態(tài)工廠方法是static的,是在類加載的時候就創(chuàng)建了,可以直接使用,不需要實例化工廠類。實例工廠是public的,需要先實例化,才能使用。靜態(tài)工廠適合實時性很高的場景。實際場景中大部分使用實例工廠。
2、實例工廠的簡單寫法——FactoryBean
涉及代碼片。
// applicationContext.xml <bean id="flowDao3" class="com.lwb.factory.FlowDaoFactoryBean"/>
// FlowDaoFactoryBean .java
public class FlowDaoFactoryBean implements FactoryBean<FlowDao> {
//返回實例化對象
@Override
public FlowDao getObject() throws Exception{
System.out.println(this.getClass() + "------進(jìn)入實例工廠FlowDaoFactoryBean,getObject");
return new FlowDaoImpl();
}
//返回class對象
@Override
public Class<?> getObjectType() {
System.out.println(this.getClass() + "------進(jìn)入實例工廠FlowDaoFactoryBean,getObjectType");
return FlowDao.class;
}
}
// App.java
public class App {
public static void main(String[] args){
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
}

思考:
1、為什么只輸出了getObject()里面的內(nèi)容?getObject()重寫了返回實例化對象的方法。getObjectType()返回的是class對象,只有在調(diào)用的時候才會執(zhí)行(反射?)
2、FlowDaoFactoryBean可以通過重寫isSingleton()方法聲明是否是單例。
思考
1、上述例子中App.java為什么不獲取bean(執(zhí)行FlowDao flowDao = (FlowDao) ctx.getBean("flowDao3")),也能實例化?
IOC實例化bean對象的時機(jī):
(1)IOC初始化的bean對象默認(rèn)是單例的。單例+懶加載會在ioc容器初始化完成后直接實例化所有bean對象供使用。
(2)非單例和單例+非懶加載。在使用bean的時候才會去初始化。
以上就是Spring的IOC容器實例化bean的方式總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Spring IOC容器實例化bean的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
IDEA使用SequenceDiagram插件繪制時序圖的方法
這篇文章主要介紹了IDEA使用SequenceDiagram插件繪制時序圖的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Java網(wǎng)絡(luò)編程UDP實現(xiàn)多線程在線聊天
這篇文章主要為大家詳細(xì)介紹了Java網(wǎng)絡(luò)編程UDP實現(xiàn)多線程在線聊天,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-07-07
java abstract class interface之間的區(qū)別介紹
含有abstract修飾符的class即為抽象類,abstract 類不能創(chuàng)建的實例對象,abstract class類中定義抽象方法必須在具體(Concrete)子類中實現(xiàn),所以,不能有抽象構(gòu)造方法或抽象靜態(tài)方法2012-11-11
@RequestParam 接收參數(shù)的值為null的處理方式
這篇文章主要介紹了@RequestParam 接收參數(shù)的值為null的處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
Mybatis-plus操作json字段實戰(zhàn)教程
這篇文章主要介紹了Mybatis-plus操作json字段實戰(zhàn)教程,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02

