使用Spring的FactoryBean創(chuàng)建和獲取Bean對象方式
Spring的FactoryBean創(chuàng)建和獲取Bean對象
在Spring框架中,F(xiàn)actoryBean接口提供了一種強大的機制來創(chuàng)建復(fù)雜的bean實例。
本文將基于提供的代碼示例,詳細(xì)介紹如何通過FactoryBean創(chuàng)建bean對象,并展示如何獲取這些bean實例以及它們所屬的FactoryBean實例。
示例代碼類
- 定義 MyBean 接口。
首先,我們定義一個簡單的接口MyBean,它包含一個show方法:
public interface MyBean { /** * 顯示信息 */ void show(); }
- 實現(xiàn) MyFactoryBean 類。
我們實現(xiàn)FactoryBean接口來創(chuàng)建MyBean類型的實例。
在這個例子中,MyFactoryBean負(fù)責(zé)創(chuàng)建并返回實現(xiàn)了MyBean接口的對象:
@Component public class MyFactoryBean implements FactoryBean<MyBean> { // 這個 myBean 成員變量,在本文中可以忽略,我自己用作其他用途使用的 private MyBean myBean; @Override public MyBean getObject() throws Exception { System.err.println("getObject"); if(myBean == null) { myBean = new MyBean() { @Override public void show() { System.err.println("MyFactoryBean.show"); } }; } return myBean; } @Override public Class<?> getObjectType() { return MyBean.class; } }
這里,MyFactoryBean使用了匿名內(nèi)部類的方式實現(xiàn)了MyBean接口,并重寫了show方法。其中定義了一個 myBean 成員變量,這個可以忽略,我自己用作其他用途使用的。
從Spring容器中獲取實例對象
為了從Spring容器中獲取MyFactoryBean生成的bean實例或MyFactoryBean本身,我們需要先獲取 ApplicationContext
實例本身,下面代碼中的 SpringContextHolder.getApplicationContext()
是我自己定義好的工具類,假設(shè)通過它獲取到 ApplicationContext
對象。
以下是獲取工廠類自身實例 和 工廠類產(chǎn)生的具體 Bean實例的具體方法:
1、獲取由FactoryBean創(chuàng)建的具體bean實例:
// 通過工廠類的名稱獲取 MyBean myBean = (MyBean) SpringContextHolder.getApplicationContext().getBean("myFactoryBean"); // 通過Bean類型獲?。ㄈ绻阌卸鄠€工廠,都生產(chǎn)MyBean,請不要使用MyBean.class獲取,它會同時執(zhí)行你的多個工廠類) MyBean myBean = SpringContextHolder.getApplicationContext().getBean(MyBean.class);
2、獲取產(chǎn)生Bean實例的具體工廠類FactoryBean自身的實例:
如果你想直接操作FactoryBean(例如,進行一些配置調(diào)整),你可以通過在bean名稱前加上&
作為前綴來獲取FactoryBean的實例,這是 Spring 內(nèi)置的命名規(guī)則:
// 通過工廠類的名稱和&符號獲取 MyFactoryBean factoryBean = (MyFactoryBean) SpringContextHolder.getApplicationContext().getBean("&myFactoryBean"); // 通過工廠類class MyFactoryBean factoryBean = SpringContextHolder.getApplicationContext().getBean(MyFactoryBean.class);
單例和多實例
通過重寫方法 isSingleton()
控制返回值來決定該工廠類每次都返回一個實例,還是每次都返回單例的bean(默認(rèn)值是 true,單實例模式)。
注意:工廠類自身還是單例的,我們一般我們不會為工廠類設(shè)置 prototype
,只是在需要的時候重寫 isSingleton()
方法返回 false
來實現(xiàn)多例。
總結(jié)
通過上述步驟,我們不僅能夠輕松地從Spring容器中獲取由FactoryBean創(chuàng)建的bean實例,還能獲取到這個FactoryBean的實例本身。這種靈活性使得FactoryBean成為了處理復(fù)雜bean創(chuàng)建邏輯的強大工具。無論你是需要定制化bean的創(chuàng)建過程,還是希望對bean的生命周期有更精細(xì)的控制,F(xiàn)actoryBean都能滿足你的需求。
通過這種方式,開發(fā)者可以更加靈活地管理和操作Spring中的bean實例,提高代碼的可維護性和擴展性。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Springboot+WebSocket+Netty實現(xiàn)在線聊天/群聊系統(tǒng)
這篇文章主要實現(xiàn)在好友添加、建群、聊天對話、群聊功能,使用Java作為后端語言進行支持,界面友好,開發(fā)簡單,文章中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2023-08-08Spring Security 中的 AuthenticationManager配置及使用
本文我們將探討 AuthenticationManager 在 Spring Security 中的作用,并指導(dǎo)您完成其配置和實際應(yīng)用,感興趣的朋友跟隨小編一起看看吧2024-11-11Java中forward轉(zhuǎn)發(fā)與redirect重定向的區(qū)別
轉(zhuǎn)發(fā)和重定向都是常用的頁面跳轉(zhuǎn)方式,但在實現(xiàn)上有一些區(qū)別,本文主要介紹了Java中forward轉(zhuǎn)發(fā)與redirect重定向的區(qū)別,具有一定的參考價值,感興趣的可以了解一下2023-11-11淺談Java設(shè)置PPT幻燈片背景——純色、漸變、圖片背景
這篇文章主要介紹了Java設(shè)置PPT幻燈片背景——純色、漸變、圖片背景,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03