自定義myfactorybean,只需要實現factorybean介面即可
我們需求將這個myfactorybean加入到ioc容器中,使用@component註解即可package com.jack.factorybean;
@component
public class myfactorybean implements factorybean
@override
public class> getobjecttype()
@override
public boolean issingleton()
}
,快速構建乙個ioc容器,並將上面的bean掃瞄到ioc容器中
經過這個步驟,容器中應該有乙個myfactorybean,並且名字為 myfactory,事實上並不是這樣。@configuration
@componentscan("com.jack.factorybean")
public class factorybeanconfig
我們來看下面的測試類:
執行結果為:@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)
具體使用如下:
於是我們可以自己建立乙個sqlsessionfactorybean並新增到ioc容器中,這樣就可以將它生成的sqlsessionfactory也一併交由ioc容器管理了。當然我們需要的是sqlsessionfactory,現在可以使用@autowired等標籤從容器中獲取了。@bean
public sqlsessionfactorybean sqlsessionfactorybean(datasource datasource)
這是 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...