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í)例
適用場(chǎng)景:大多數(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):
- 配置最簡(jiǎn)單(只需class屬性)
- Bean類不需要任何特殊方法
- 通過
getBean(Class)可直接獲取實(shí)例
方式2:靜態(tài)工廠方法
原理:通過工廠類的靜態(tài)方法創(chuàng)建實(shí)例
適用場(chǎng)景:封裝對(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í)例方法
適用場(chǎng)景:工廠需要維護(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ù)雜度 | ? (最簡(jiǎn)單) | ?? | ??? (最復(fù)雜) |
| 創(chuàng)建邏輯 | 直接調(diào)用構(gòu)造器 | 靜態(tài)方法封裝 | 實(shí)例方法封裝 |
| 工廠狀態(tài) | 不支持 | 無狀態(tài) | 可維護(hù)狀態(tài) |
| 適用場(chǎng)景 | 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%場(chǎng)景適用 --> <bean id="service" class="com.example.Service"/>
2.靜態(tài)工廠適用場(chǎng)景
// 當(dāng)需要復(fù)雜初始化時(shí)
public class ConnectionFactory {
public static Connection create() {
// 復(fù)雜初始化代碼
return DriverManager.getConnection(...);
}
}3.實(shí)例工廠適用場(chǎng)景
// 當(dāng)工廠需要依賴其他Bean時(shí)
public class PaymentFactory {
@Autowired
private Config config;
public Payment create() {
return new Payment(config);
}
}4.避免的常見錯(cuò)誤
掌握這三種實(shí)例化方式,能夠靈活應(yīng)對(duì)不同場(chǎng)景的對(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如何通過Map實(shí)現(xiàn)策略模式
策略模式是一種行為設(shè)計(jì)模式,它允許在運(yùn)行時(shí)選擇算法的行為,在Spring框架中,我們可以利用@Resource注解和Map集合來優(yōu)雅地實(shí)現(xiàn)策略模式,這篇文章主要介紹了SpringBoot如何通過Map實(shí)現(xiàn)策略模式,需要的朋友可以參考下2025-03-03
關(guān)于Mybatis實(shí)體別名支持通配符掃描問題小結(jié)
MyBatis可以使用簡(jiǎn)單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對(duì)象)映射成數(shù)據(jù)庫中的記錄,這篇文章主要介紹了Mybatis實(shí)體別名支持通配符掃描的問題,需要的朋友可以參考下2022-01-01
有關(guān)ServletConfig與ServletContext的訪問
下面小編就為大家?guī)硪黄嘘P(guān)ServletConfig與ServletContext的訪問。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01
使用Java獲取html中Select,radio多選的值方法
以下是對(duì)使用Java獲取html中Select,radio多選值的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-08-08
MAC上IntelliJ IDEA的svn無法保存密碼解決方案
今天小編就為大家分享一篇關(guān)于MAC上IntelliJ IDEA的svn無法保存密碼解決方案,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10
SpringBoot+WebSocket搭建簡(jiǎn)單的多人聊天系統(tǒng)
WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議。這是一種比較官方的說法,簡(jiǎn)單點(diǎn)來說就是,在一次TCP連接中,通信的雙方可以相互通信。這篇文章主要介紹了SpringBoot+WebSocket搭建簡(jiǎn)單的多人聊天系統(tǒng),需要的朋友可以參考下2019-10-10

