日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

Spring強大的FactoryBean還能這樣用,漲知識

來源: 責(zé)編: 時間:2024-07-10 17:57:14 733觀看
導(dǎo)讀環(huán)境:Spring6.1.71. 簡介FactoryBean 接口是 Spring IoC 容器實例化邏輯的一個可插入點。如果你有復(fù)雜的初始化代碼,而這些代碼最好用 Java 而不是冗長的 XML 來表達,那么你可以通過自定義自己的 FactoryBean,在該類中編

環(huán)境:Spring6.1.7j8q28資訊網(wǎng)——每日最新資訊28at.com

1. 簡介

FactoryBean 接口是 Spring IoC 容器實例化邏輯的一個可插入點。如果你有復(fù)雜的初始化代碼,而這些代碼最好用 Java 而不是冗長的 XML 來表達,那么你可以通過自定義自己的 FactoryBean,在該類中編寫復(fù)雜的初始化,然后將自定義 FactoryBean 添加到容器中。j8q28資訊網(wǎng)——每日最新資訊28at.com

FactoryBean<T> 接口提供了三種方法:j8q28資訊網(wǎng)——每日最新資訊28at.com

  • T getObject(): 返回該工廠創(chuàng)建的對象的實例。該實例可能是共享的,這取決于該工廠返回的是單體還是原型
  • boolean isSingleton(): 如果此 FactoryBean 返回單例,則返回 true;否則返回 false。此方法的默認實現(xiàn)返回 true。
  • Class<?> getObjectType(): 返回 getObject() 方法返回的對象類型,如果事先不知道類型,則返回空值。

FactoryBean接口在Spring框架非多的地方被使用。Spring本身就包含了50多個FactoryBean接口的實現(xiàn)。j8q28資訊網(wǎng)——每日最新資訊28at.com

2. 實戰(zhàn)案例

準備基本類;j8q28資訊網(wǎng)——每日最新資訊28at.com

class PersonService {  public void save() {     // TODO     System.out.println("save person...") ;  }}

接下來會基于上面的PersonService類進行FactoryBean各種案例的使用;j8q28資訊網(wǎng)——每日最新資訊28at.com

2.1 簡單示例

自定義FactoryBean<PersonService>實現(xiàn);j8q28資訊網(wǎng)——每日最新資訊28at.com

@Componentpublic class PersonServiceFactoryBean implements FactoryBean<PersonService> {  // 具體的實例  public PersonService getObject() throws Exception {    PersonService ps = new PersonService() ;    return ps ;  }  // 具體的類型  public Class<?> getObjectType() {    return PersonService.class ;  }  // true,返回單例容器中只會有一個PersonService  public boolean isSingleton() {    return true ;  }}

具體使用;j8q28資訊網(wǎng)——每日最新資訊28at.com

// 你可以直接在其它的Bean中注入@Resource    private PersonService personService ;// 你可以通過BeanFactory手動獲取private ApplicationContext contet ;PersonService ps = context.getBean(PersonService.class) ;

使用時和普通的Bean的使用方式一致。j8q28資訊網(wǎng)——每日最新資訊28at.com

2.2 多例&不指定類型

多例;j8q28資訊網(wǎng)——每日最新資訊28at.com

如果你需要每次使用時返回的都是不同的實例對象,那么你可以將isSingleton返回為false。j8q28資訊網(wǎng)——每日最新資訊28at.com

// 將上面的isSingleton返回為falsepublic boolean isSingleton() {  return false ;}

接下來使用時,不管是在其它組件中進行注入還是通過getBean獲取,都能確保在每個組件中使用的都不是同一個實例。j8q28資訊網(wǎng)——每日最新資訊28at.com

@Componentpublic class PersonController {  @Resource  private PersonService personService ;}@Componentpublic class CommonService {  @Resource  private PersonService personService ;}

上面兩個類中注入的PersonService將不是同一個實例,如果你通過getBean獲取每次也都不是同一個實例。j8q28資訊網(wǎng)——每日最新資訊28at.com

不指定類型;j8q28資訊網(wǎng)——每日最新資訊28at.com

如果你將FactoryBean#getObjectType方法返回為null。那么你將無法正確的注入PersonService對象,同時程序?qū)伋霎惓?span style="display:none">j8q28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片j8q28資訊網(wǎng)——每日最新資訊28at.com

2.3 創(chuàng)建代理

你可以通過FactoryBean創(chuàng)建代理對象借助ProxyFactory。將getObject修改如下:j8q28資訊網(wǎng)——每日最新資訊28at.com

public PersonService getObject() throws Exception {  ProxyFactory factory = new ProxyFactory() ;  factory.setTarget(new PersonService()) ;  factory.addAdvice(new MethodInterceptor() {    @Override    public Object invoke(MethodInvocation invocation) throws Throwable {      System.out.println("before...") ;      return invocation.proceed() ;    }  }) ;  return (PersonService) factory.getProxy() ;}

通過FactoryBean能夠非常方便的以編程的方式創(chuàng)建代理對象。j8q28資訊網(wǎng)——每日最新資訊28at.com

2.4 獲取原始FactoryBean

如果你需要獲取FactoryBean本身,而非getObjectType類型,那么你可以通過如下方式:j8q28資訊網(wǎng)——每日最新資訊28at.com

// 方式1:直接通過類型獲取private ApplicationContext context ;context.getBean(PersonServiceFactoryBean.class) ;// 方式2:通過beanName獲取,但是需要添加'&'前綴context.getBean("&psFactoryBean") ;

上面2種方式都能正確的獲取原始的FactoryBean對象。j8q28資訊網(wǎng)——每日最新資訊28at.com

2.5 利用SPI獲取對象

Spring為我們提供了ServiceFactoryBean類,通過該類我們能非常方便的獲取SPI對象并注冊為容器Bean。j8q28資訊網(wǎng)——每日最新資訊28at.com

@Configurationpublic class AppConfig {  @Bean  public ServiceFactoryBean serviceFactoryBean() {    ServiceFactoryBean fb = new ServiceFactoryBean() ;    // 指定SPI接口類型    fb.setServiceType(DAO.class) ;    return fb ;  }}

接下來你就可以在META-INF/services下建立DAO全限定名的文件j8q28資訊網(wǎng)——每日最新資訊28at.com

com.pack.bean.create.PersonDAOcom.pack.bean.create.StudentDAO

當(dāng)在容器中注入DAO時,你將得到這里的第一個PersonDAO實例。j8q28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-100187-0.htmlSpring強大的FactoryBean還能這樣用,漲知識

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: DDD 是什么?—— 你以前只會用 Service + 貧血模型!

下一篇: Go與神經(jīng)網(wǎng)絡(luò):線性回歸

標簽:
  • 熱門焦點
  • Redmi Pad評測:紅米充滿野心的一次嘗試

    從Note系列到K系列,從藍牙耳機到筆記本電腦,紅米不知不覺之間也已經(jīng)形成了自己頗有競爭力的產(chǎn)品體系,在中端和次旗艦市場上甚至要比小米新機的表現(xiàn)來得更好,正所謂“大丈夫生居
  • 分享六款相見恨晚的PPT模版網(wǎng)站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS網(wǎng)站旨在為全球Office用戶提供豐富的高品質(zhì)原創(chuàng)PPT模板、實用文檔、數(shù)據(jù)圖表及個性化定制服務(wù)。優(yōu)點:OfficePLUS是微軟官方網(wǎng)站,囊括PPT模板、Word模
  • 之家push系統(tǒng)迭代之路

    前言在這個信息爆炸的互聯(lián)網(wǎng)時代,能夠及時準確獲取信息是當(dāng)今社會要解決的關(guān)鍵問題之一。隨著之家用戶體量和內(nèi)容規(guī)模的不斷增大,傳統(tǒng)的靠"主動拉"獲取信息的方式已不能滿足用
  • 一文掌握 Golang 模糊測試(Fuzz Testing)

    模糊測試(Fuzz Testing)模糊測試(Fuzz Testing)是通過向目標系統(tǒng)提供非預(yù)期的輸入并監(jiān)視異常結(jié)果來發(fā)現(xiàn)軟件漏洞的方法。可以用來發(fā)現(xiàn)應(yīng)用程序、操作系統(tǒng)和網(wǎng)絡(luò)協(xié)議等中的漏洞或
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會涉及各種各樣的安全任務(wù),包括但不限于:開發(fā)某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • 小紅書1周漲粉49W+,我總結(jié)了小白可以用的N條漲粉筆記

    作者:黃河懂運營一條性教育視頻,被54萬人&ldquo;珍藏&rdquo;是什么體驗?最近,情感博主@公主是用鮮花做的,火了!僅僅憑借一條視頻,光小紅書就有超過128萬人,為她瘋狂點贊!更瘋狂的是,這
  • 拼多多APP上線本地生活入口,群雄逐鹿萬億市場

    Tech星球(微信ID:tech618)文 | 陳橋輝 Tech星球獨家獲悉,拼多多在其APP內(nèi)上線了&ldquo;本地生活&rdquo;入口,位置較深,位于首頁的&ldquo;充值中心&rdquo;內(nèi),目前主要售賣美食相關(guān)的
  • 網(wǎng)傳小米汽車開始篩選交付中心 建筑面積不低于3000平方米

    7月7日消息,近日有微博網(wǎng)友@長三角行健者爆料稱,據(jù)經(jīng)銷商集團反饋,小米汽車目前已經(jīng)開始了交付中心的篩選工作,要求候選場地至少有120個車位,建筑不能低
  • 世界人工智能大會國際日開幕式活動在世博展覽館開啟

    30日上午,世界人工智能大會國際日開幕式活動在世博展覽館開啟,聚集國際城市代表、重量級院士專家、國際創(chuàng)新企業(yè)代表,共同打造人工智能交流平臺。上海市副市
Top 主站蜘蛛池模板: 嘉兴市| 罗山县| 东至县| 太原市| 阿拉善盟| 防城港市| 文水县| 清苑县| 封丘县| 德惠市| 资中县| 凤城市| 铜梁县| 若羌县| 晋中市| 和硕县| 南投市| 田东县| 射洪县| 德保县| 德州市| 泰州市| 利辛县| 江阴市| 鄂托克旗| 克东县| 视频| 桑日县| 子长县| 津市市| 葫芦岛市| 石景山区| 固安县| 时尚| 唐河县| 贡觉县| 陵川县| 宜丰县| 三原县| 汽车| 涡阳县|