Spring實(shí)例化Bean的三種方式詳解
在Spring框架中,Bean實(shí)例化是IoC容器的核心功能。本文將結(jié)合具體代碼示例,詳細(xì)講解三種實(shí)例化方式及其實(shí)現(xiàn)方法。
<!--spring.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="Bean1" class="com.qcby.bean.Bean1"></bean> <!-- 普通方法-->
<bean id="bean2" class="com.qcby.bean.MyfactoryBean2" factory-method="creatbean2"></bean><!--靜態(tài)工廠-->
<!--創(chuàng)建myfactoryBean3的Bean-->
<bean id="myfactoryBean3" class="com.qcby.bean.MyfactoryBean3"/>
<bean id="bean3" factory-bean="myfactoryBean3" factory-method="creatBean3"/>
</beans>方式1:默認(rèn)構(gòu)造器實(shí)例化(最常用)
原理:Spring直接調(diào)用類的無參構(gòu)造器創(chuàng)建實(shí)例
適用場景:大多數(shù)常規(guī)Bean的初始化
代碼實(shí)現(xiàn):
// Bean1.java
package com.qcby.bean;
public class Bean1 {} // 只需無參構(gòu)造器<!-- spring.xml 配置 --> <bean id="Bean1" class="com.qcby.bean.Bean1"/>
// instancebean1.java
package com.qcby;
public class instancebean1 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
Bean1 bean1 = context.getBean(Bean1.class); // 直接通過類型獲取
System.out.println(bean1);
}
}特點(diǎn):
- 配置最簡單(只需class屬性)
- Bean類不需要任何特殊方法
- 通過
getBean(Class)可直接獲取實(shí)例
方式2:靜態(tài)工廠方法
原理:通過工廠類的靜態(tài)方法創(chuàng)建實(shí)例
適用場景:封裝對(duì)象創(chuàng)建邏輯
代碼實(shí)現(xiàn):
// Bean2.java
package com.qcby.bean;
public class Bean2 {}
// MyfactoryBean2.java
package com.qcby.bean;
public class MyfactoryBean2 {
public static Bean2 creatbean2() {
return new Bean2(); // 靜態(tài)工廠方法
}
}<!-- spring.xml 配置 -->
<bean id="bean2" class="com.qcby.bean.MyfactoryBean2"
factory-method="creatbean2"/>// instancebean2.java
package com.qcby;
public class instancebean2 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
Bean2 bean2 = (Bean2) context.getBean("bean2"); // 通過bean id獲取
System.out.println(bean2);
}
}特點(diǎn):
- 工廠類不需要實(shí)例化
- 使用
factory-method指定靜態(tài)方法 - 適合整合第三方庫或復(fù)雜初始化邏輯
方式3:實(shí)例工廠方法
原理:先創(chuàng)建工廠Bean,再調(diào)用其實(shí)例方法
適用場景:工廠需要維護(hù)狀態(tài)或多例Bean創(chuàng)建
代碼實(shí)現(xiàn):
// Bean3.java
package com.qcby.bean;
public class Bean3 {}
// MyfactoryBean3.java
package com.qcby.bean;
public class MyfactoryBean3 {
public Bean3 creatBean3() {
return new Bean3(); // 實(shí)例工廠方法
}
}<!-- spring.xml 配置 -->
<bean id="myfactoryBean3" class="com.qcby.bean.MyfactoryBean3"/>
<bean id="bean3" factory-bean="myfactoryBean3"
factory-method="creatBean3"/>// instancebean3.java
package com.qcby;
public class instancebean3 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
Bean3 bean3 = (Bean3) context.getBean("bean3");
System.out.println(bean3);
}
}特點(diǎn):
- 需要兩個(gè)Bean配置(工廠+目標(biāo))
- 工廠Bean本身可被注入依賴
- 使用
factory-bean和factory-method關(guān)聯(lián)
三種方式對(duì)比表
| 特性 | 默認(rèn)構(gòu)造器 | 靜態(tài)工廠方法 | 實(shí)例工廠方法 |
|---|---|---|---|
| 配置復(fù)雜度 | ? (最簡單) | ?? | ??? (最復(fù)雜) |
| 創(chuàng)建邏輯 | 直接調(diào)用構(gòu)造器 | 靜態(tài)方法封裝 | 實(shí)例方法封裝 |
| 工廠狀態(tài) | 不支持 | 無狀態(tài) | 可維護(hù)狀態(tài) |
| 適用場景 | 90%常規(guī)對(duì)象 | 復(fù)雜初始化邏輯 | 工廠需依賴其他Bean |
| 獲取方式 | getBean(Class) | getBean("id") | getBean("id") |
src ├── main │ ├── java │ │ ├── com.qcby │ │ │ ├── instancebean1.java │ │ │ ├── instancebean2.java │ │ │ └── instancebean3.java │ │ └── com.qcby.bean │ │ ├── Bean1.java │ │ ├── Bean2.java │ │ ├── Bean3.java │ │ ├── MyfactoryBean2.java │ │ └── MyfactoryBean3.java │ └── resources │ └── spring.xml
最佳實(shí)踐建議
1.優(yōu)先選擇默認(rèn)構(gòu)造器
<!-- 99%場景適用 --> <bean id="service" class="com.example.Service"/>
2.靜態(tài)工廠適用場景
// 當(dāng)需要復(fù)雜初始化時(shí)
public class ConnectionFactory {
public static Connection create() {
// 復(fù)雜初始化代碼
return DriverManager.getConnection(...);
}
}3.實(shí)例工廠適用場景
// 當(dāng)工廠需要依賴其他Bean時(shí)
public class PaymentFactory {
@Autowired
private Config config;
public Payment create() {
return new Payment(config);
}
}4.避免的常見錯(cuò)誤
掌握這三種實(shí)例化方式,能夠靈活應(yīng)對(duì)不同場景的對(duì)象創(chuàng)建需求,是深入理解Spring IoC容器的關(guān)鍵基礎(chǔ)。
以上就是Spring實(shí)例化Bean的三種方式詳解的詳細(xì)內(nèi)容,更多關(guān)于Spring實(shí)例化Bean的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springboot實(shí)現(xiàn)熱部署操作方法
這篇文章主要介紹了springboot實(shí)現(xiàn)熱部署操作方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
在Java中動(dòng)態(tài)執(zhí)行字符串代碼的方法小結(jié)
在Java編程中,靜態(tài)編譯的特性通常不允許我們直接執(zhí)行運(yùn)行時(shí)生成的代碼,然而,有時(shí)我們需要?jiǎng)討B(tài)地生成并執(zhí)行代碼片段,本文將詳細(xì)介紹如何在Java中運(yùn)行一段字符串代碼,并提供詳細(xì)的代碼案例和運(yùn)行結(jié)果,需要的朋友可以參考下2024-08-08
java中自定義Spring Security權(quán)限控制管理示例(實(shí)戰(zhàn)篇)
本篇文章主要介紹了java中自定義Spring Security權(quán)限控制管理示例(實(shí)戰(zhàn)篇) ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02
IDEA使用Mybatis插件 MyBatisCodeHelper-Pro的圖文教程
這篇文章主要介紹了IDEA使用Mybatis插件 MyBatisCodeHelper-Pro的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09

