FactoryBean的使用方法及作用

2021-09-10 01:26:10 字數 3739 閱讀 3470

自定義myfactorybean,只需要實現factorybean介面即可

package com.jack.factorybean;

@component

public class myfactorybean implements factorybean

@override

public class> getobjecttype()

@override

public boolean issingleton()

}

我們需求將這個myfactorybean加入到ioc容器中,使用@component註解即可

,快速構建乙個ioc容器,並將上面的bean掃瞄到ioc容器中

@configuration

@componentscan("com.jack.factorybean")

public class factorybeanconfig

經過這個步驟,容器中應該有乙個myfactorybean,並且名字為 myfactory,事實上並不是這樣。

我們來看下面的測試類:

@test

public void testfactorybean()

執行結果為:

@compontent注入到容器中的型別是myfactorybean,自動生成的名字是 mybeanfactory,但是事實上根據這個名字獲取的的卻是myfactorybean的 getobject() 方法所返回的例項。確實是這樣,我們往容器中新增乙個 factorybean (實現了factorybean介面的bean),實際上在容器中產生了兩個bean,乙個是這個factorybean的getobject() 方法所返回的例項,這個bean正好使用了自動生成的名字,另乙個bean則是真正的factorybean型別,而它的名字是在名字前面加乙個&。總之,如果使用factorybean,那麼會產生兩個bean。

spring往ioc容器中新增bean的方式有很多種,例如在xml中使用bean標籤,使用 @bean 、@component 等註解,那為什麼還要設計這麼一種方式給容器中新增bean呢?主要原因是為了服務第三方類。

我們在乙個專案中除了使用spring框架以外,可能還要用到其他很多第三方框架,例如orm框架 mybatis ,為了使用ioc容器進行解耦,我們需要將第三方框架中的核心類加入到spring的ioc容器中去,那怎麼加進去呢?我們不能修改第三方框架的**,因此在類上加入@compontent或其他註解肯定是不行的,於是我們還可以使用 bean 標籤在xml檔案中定義,這種方式行不通,原因是如果我們需要新增的 bean有很多屬性,則 bean標籤的數量會讓任何乙個程式設計師崩潰。當然還可以在配置類中使用@bean這種型別,如果我們還想使用@component或者@service等註解靈活在新增到容器中,就必須借助factorybean,其實使用起來也非常簡單,就如上面的例子,factorybean在各種框架中使用非常廣泛。下面看看 mybatis 是如何使用的。

我們知道使用 mybatis 的時候需要有乙個sqlsessionfactory的屬性又非常多,正好面臨上面說的困境,於是 mybatis 在 mybatis-spring 框架包中提供了乙個sqlsessionfactorybean給開發者使用,部分**如下:

private static final log logger = logfactory.getlog(sqlsessionfactorybean.class);

private resource configlocation;

private configuration configuration;

private datasource datasource;

private transactionfactory transactionfactory;

private properties configurationproperties;

private sqlsessionfactorybuilder sqlsessionfactorybuilder = new sqlsessionfactorybuilder();

private sqlsessionfactory sqlsessionfactory;

//environmentaware requires spring 3.1

private string environment = sqlsessionfactorybean.class.get******name();

private boolean failfast;

private interceptor plugins;

private typehandler> typehandlers;

private string typehandlerspackage;

private class> typealiases;

private string typealiasespackage;

private class> typealiasessupertype;

//issue #19. no default provider.

private databaseidprovider databaseidprovider;

private class extends vfs> vfs;

private cache cache;

private objectfactory objectfactory;

/*** sets the objectfactory.

** @since 1.1.2

* @param objectfactory

*/public void setobjectfactory(objectfactory objectfactory)

具體使用如下:

@bean

public sqlsessionfactorybean sqlsessionfactorybean(datasource datasource)

於是我們可以自己建立乙個sqlsessionfactorybean並新增到ioc容器中,這樣就可以將它生成的sqlsessionfactory也一併交由ioc容器管理了。當然我們需要的是sqlsessionfactory,現在可以使用@autowired等標籤從容器中獲取了。

這是 mybatis 提供的一種使用 factorybean 的思路,我們在使用ioc程式設計的時候,如果遇到類似的困難,也可以使用 factorybean 巧妙地解決。

Bean 的配置方式 FactoryBean

實現 factorybean 介面在spring ioc 容器中配置 bean spring 中有兩種型別的bean,一種是普通bean,另一種是工廠bean,即factorybean.工廠 bean 跟普通bean不同,其返回的物件不是指定類的乙個例項,其返回的是該工廠 bean 的 getobj...

Spring中FactoryBean的應用

factorybean介面定義了以下3個介面方法 object getobject 返回有factorybean建立的bean例項,如果issingleton 返回true,則該例項會放到spring容器的單例項快取池中。boolean issingleton 確定由factorybean建立bea...

Spring 中 FactoryBean 的使用

許久沒記錄筆記了,這回來重新熟悉一下 spring 中 factorybean 的使用,顧名思義,它是用來獲得相應 bean 的工廠的。它與另乙個 spring 中的介面 beanfactory 的作用不一樣的,不能多說了。factorybean 和 beanfactory 都是在org.sprin...