使用Spring的FactoryBean創(chuàng)建和獲取Bean對(duì)象方式
Spring的FactoryBean創(chuàng)建和獲取Bean對(duì)象
在Spring框架中,F(xiàn)actoryBean接口提供了一種強(qiáng)大的機(jī)制來創(chuàng)建復(fù)雜的bean實(shí)例。
本文將基于提供的代碼示例,詳細(xì)介紹如何通過FactoryBean創(chuàng)建bean對(duì)象,并展示如何獲取這些bean實(shí)例以及它們所屬的FactoryBean實(shí)例。
示例代碼類
- 定義 MyBean 接口。
首先,我們定義一個(gè)簡單的接口MyBean,它包含一個(gè)show方法:
public interface MyBean { /** * 顯示信息 */ void show(); }
- 實(shí)現(xiàn) MyFactoryBean 類。
我們實(shí)現(xiàn)FactoryBean接口來創(chuàng)建MyBean類型的實(shí)例。
在這個(gè)例子中,MyFactoryBean負(fù)責(zé)創(chuàng)建并返回實(shí)現(xiàn)了MyBean接口的對(duì)象:
@Component public class MyFactoryBean implements FactoryBean<MyBean> { // 這個(gè) 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)部類的方式實(shí)現(xiàn)了MyBean接口,并重寫了show方法。其中定義了一個(gè) myBean 成員變量,這個(gè)可以忽略,我自己用作其他用途使用的。
從Spring容器中獲取實(shí)例對(duì)象
為了從Spring容器中獲取MyFactoryBean生成的bean實(shí)例或MyFactoryBean本身,我們需要先獲取 ApplicationContext
實(shí)例本身,下面代碼中的 SpringContextHolder.getApplicationContext()
是我自己定義好的工具類,假設(shè)通過它獲取到 ApplicationContext
對(duì)象。
以下是獲取工廠類自身實(shí)例 和 工廠類產(chǎn)生的具體 Bean實(shí)例的具體方法:
1、獲取由FactoryBean創(chuàng)建的具體bean實(shí)例:
// 通過工廠類的名稱獲取 MyBean myBean = (MyBean) SpringContextHolder.getApplicationContext().getBean("myFactoryBean"); // 通過Bean類型獲?。ㄈ绻阌卸鄠€(gè)工廠,都生產(chǎn)MyBean,請(qǐng)不要使用MyBean.class獲取,它會(huì)同時(shí)執(zhí)行你的多個(gè)工廠類) MyBean myBean = SpringContextHolder.getApplicationContext().getBean(MyBean.class);
2、獲取產(chǎn)生Bean實(shí)例的具體工廠類FactoryBean自身的實(shí)例:
如果你想直接操作FactoryBean(例如,進(jìn)行一些配置調(diào)整),你可以通過在bean名稱前加上&
作為前綴來獲取FactoryBean的實(shí)例,這是 Spring 內(nèi)置的命名規(guī)則:
// 通過工廠類的名稱和&符號(hào)獲取 MyFactoryBean factoryBean = (MyFactoryBean) SpringContextHolder.getApplicationContext().getBean("&myFactoryBean"); // 通過工廠類class MyFactoryBean factoryBean = SpringContextHolder.getApplicationContext().getBean(MyFactoryBean.class);
單例和多實(shí)例
通過重寫方法 isSingleton()
控制返回值來決定該工廠類每次都返回一個(gè)實(shí)例,還是每次都返回單例的bean(默認(rèn)值是 true,單實(shí)例模式)。
注意:工廠類自身還是單例的,我們一般我們不會(huì)為工廠類設(shè)置 prototype
,只是在需要的時(shí)候重寫 isSingleton()
方法返回 false
來實(shí)現(xiàn)多例。
總結(jié)
通過上述步驟,我們不僅能夠輕松地從Spring容器中獲取由FactoryBean創(chuàng)建的bean實(shí)例,還能獲取到這個(gè)FactoryBean的實(shí)例本身。這種靈活性使得FactoryBean成為了處理復(fù)雜bean創(chuàng)建邏輯的強(qiáng)大工具。無論你是需要定制化bean的創(chuàng)建過程,還是希望對(duì)bean的生命周期有更精細(xì)的控制,F(xiàn)actoryBean都能滿足你的需求。
通過這種方式,開發(fā)者可以更加靈活地管理和操作Spring中的bean實(shí)例,提高代碼的可維護(hù)性和擴(kuò)展性。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 詳解Spring FactoryBean靈活創(chuàng)建復(fù)雜對(duì)象的秘密武器
- Spring中FactoryBean的高級(jí)用法實(shí)戰(zhàn)教程
- 關(guān)于SpringBoot+Mybatis報(bào)MapperScan.factoryBean()問題
- Spring中的FactoryBean實(shí)現(xiàn)原理詳解
- Spring中的BeanFactory與FactoryBean區(qū)別詳解
- SpringBoot升級(jí)3.2報(bào)錯(cuò)Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String的解決方案
相關(guān)文章
Springboot+WebSocket+Netty實(shí)現(xiàn)在線聊天/群聊系統(tǒng)
這篇文章主要實(shí)現(xiàn)在好友添加、建群、聊天對(duì)話、群聊功能,使用Java作為后端語言進(jìn)行支持,界面友好,開發(fā)簡單,文章中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2023-08-08Spring Security 中的 AuthenticationManager配置及使用
本文我們將探討 AuthenticationManager 在 Spring Security 中的作用,并指導(dǎo)您完成其配置和實(shí)際應(yīng)用,感興趣的朋友跟隨小編一起看看吧2024-11-11Spring Aop組成部分及實(shí)現(xiàn)步驟
面向切面編程,是對(duì)面向?qū)ο缶幊痰囊环N補(bǔ)充,是一種編程思想,是對(duì)某一類的事情的集中處理,這篇文章主要介紹了Spring Aop組成部分及實(shí)現(xiàn)步驟,需要的朋友可以參考下2023-08-08Java中forward轉(zhuǎn)發(fā)與redirect重定向的區(qū)別
轉(zhuǎn)發(fā)和重定向都是常用的頁面跳轉(zhuǎn)方式,但在實(shí)現(xiàn)上有一些區(qū)別,本文主要介紹了Java中forward轉(zhuǎn)發(fā)與redirect重定向的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(54)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你2021-08-08淺談Java設(shè)置PPT幻燈片背景——純色、漸變、圖片背景
這篇文章主要介紹了Java設(shè)置PPT幻燈片背景——純色、漸變、圖片背景,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03