AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

Spring強(qiáng)大的FactoryBean還能這樣用,漲知識

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

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

1. 簡介

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

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

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

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

2. 實戰(zhàn)案例

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

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

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

2.1 簡單示例

自定義FactoryBean<PersonService>實現(xiàn);kZ628資訊網(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 ;  }}

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

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

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

2.2 多例&不指定類型

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

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

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

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

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

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

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

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

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

2.3 創(chuàng)建代理

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

2.4 獲取原始FactoryBean

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

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

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

2.5 利用SPI獲取對象

Spring為我們提供了ServiceFactoryBean類,通過該類我們能非常方便的獲取SPI對象并注冊為容器Bean。kZ628資訊網(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全限定名的文件kZ628資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

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

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

標(biāo)簽:
  • 熱門焦點
  • 5月iOS設(shè)備性能榜:M1 M2依舊是榜單前五

    和上個月一樣,沒有新品發(fā)布的iOS設(shè)備性能榜的上榜設(shè)備并沒有什么更替,僅僅只有跑分變化而產(chǎn)生的排名變動,剛剛開始的蘋果WWDC2023,推出的產(chǎn)品也依舊是新款Mac Pro、新款Mac Stu
  • 5月iOS設(shè)備好評榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個榜單又重新匯總了數(shù)據(jù),像安卓陣營的榜單都有著比較大的變動,不過iOS由于設(shè)備的更新?lián)Q代并沒有那么快,所以相對來說變化并不大,特別是iOS好評榜,老款設(shè)
  • 六大權(quán)益!華為8月服務(wù)日開啟:手機(jī)免費貼膜、維修免人工費

    8月5日消息,一年一度的華為開發(fā)者大會2023(Together)日前在松山湖拉開帷幕,與此同時,華為8月服務(wù)日也式開啟,到店可享六大專屬權(quán)益。華為用戶可在華為商城Ap
  • 一加首款折疊屏!一加Open渲染圖出爐:罕見單手可握小尺寸

    8月5日消息,此前就有爆料稱,一加首款折疊屏手機(jī)將會在第三季度上市,如今隨著時間臨近,新機(jī)的各種消息也開始浮出水面。據(jù)悉,這款新機(jī)將會被命名為&ldquo;On
  • 如何通過Python線程池實現(xiàn)異步編程?

    線程池的概念和基本原理線程池是一種并發(fā)處理機(jī)制,它可以在程序啟動時創(chuàng)建一組線程,并將它們置于等待任務(wù)的狀態(tài)。當(dāng)任務(wù)到達(dá)時,線程池中的某個線程會被喚醒并執(zhí)行任務(wù),執(zhí)行完任
  • 多線程開發(fā)帶來的問題與解決方法

    使用多線程主要會帶來以下幾個問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結(jié)束訪問某一數(shù)據(jù)期間,該數(shù)據(jù)被其他的線程所修改,那么對于當(dāng)前線程而言,該線程
  • 19個 JavaScript 單行代碼技巧,讓你看起來像個專業(yè)人士

    今天這篇文章跟大家分享18個JS單行代碼,你只需花幾分鐘時間,即可幫助您了解一些您可能不知道的 JS 知識,如果您已經(jīng)知道了,就當(dāng)作復(fù)習(xí)一下,古人云,溫故而知新嘛。現(xiàn)在,我們就開始今
  • 一文掌握 Golang 模糊測試(Fuzz Testing)

    模糊測試(Fuzz Testing)模糊測試(Fuzz Testing)是通過向目標(biāo)系統(tǒng)提供非預(yù)期的輸入并監(jiān)視異常結(jié)果來發(fā)現(xiàn)軟件漏洞的方法。可以用來發(fā)現(xiàn)應(yīng)用程序、操作系統(tǒng)和網(wǎng)絡(luò)協(xié)議等中的漏洞或
  • onebot M24巧系列一體機(jī)采用輕薄機(jī)身設(shè)計,現(xiàn)已在各平臺開售

    onebot M24 巧系列一體機(jī)目前已在線上線下各平臺同步開售。onebot M24 巧系列采用一體化輕薄機(jī)身設(shè)計,最薄處為 10.15mm,擁有寶石紅、午夜藍(lán)、石墨綠、雅致
Top