【原創(chuàng)文章谬泌,轉(zhuǎn)載請(qǐng)注明原文章地址亲桦,謝謝忆嗜!】
MyBatis 每次創(chuàng)建結(jié)果對(duì)象實(shí)例時(shí),它使用一個(gè) ObjectFactory 實(shí)例來完成凄贩。默認(rèn)的ObjectFactory僅會(huì)按照配置結(jié)果類型的默認(rèn)構(gòu)造方法或者指定構(gòu)造方法來創(chuàng)建對(duì)象實(shí)例映屋。如果想重寫默認(rèn)的 ObjectFactory,你可以創(chuàng)建你自己的苟鸯。比如:
// ExampleObjectFactory.java
//自定義的ObjectFactory
public class ExampleObjectFactory extends DefaultObjectFactory {
//使用默認(rèn)構(gòu)造方法創(chuàng)建對(duì)象實(shí)例
public Object create(Class type) {
return super.create(type);
}
//有構(gòu)造參數(shù)列表和構(gòu)造參數(shù)值列表的創(chuàng)建對(duì)象實(shí)例的方式
public Object create(Class type, List<Class> constructorArgTypes, List<Object> constructorArgs) {
return super.create(type, constructorArgTypes, constructorArgs);
}
//為自定義ObjectFactory設(shè)置配置參數(shù)
public void setProperties(Properties properties) {
super.setProperties(properties);
}
}
<!-- mybatis-config.xml -->
<objectFactory type="org.mybatis.example.ExampleObjectFactory">
<property name="someProperty" value="100"/>
</objectFactory>
ObjectFactory 接口很簡(jiǎn)單。它包含兩個(gè)創(chuàng)建用的方法,一個(gè)是處理默認(rèn)構(gòu)造方法的,另外一個(gè)是處理帶參數(shù)構(gòu)造方法的棚点。最終,setProperties 方法可以被用來配置 ObjectFactory早处。在 初 始化 你 的 ObjectFactory 實(shí)例 后 , objectFactory 元素 體 中定 義的 屬 性會(huì) 被傳 遞 給setProperties 方法。
一個(gè)例子:
假設(shè)實(shí)體對(duì)象實(shí)現(xiàn)了自定義的InitialEntity接口瘫析,則在創(chuàng)建對(duì)象完成之后必須調(diào)用InitialEntity接口的init方法:
package cd.itcast.mybatis.myobjectfactory;
public interface InitialEntity {
void init();
}
假設(shè)有一個(gè)實(shí)體StockOutcomeBillItem對(duì)象用來記錄銷售出庫單明細(xì)砌梆,該對(duì)象再設(shè)置完值后,需要調(diào)用count()方法來完成總金額的計(jì)算:
package cd.itcast.mybatis.myobjectfactory;
public class StockOutcomeBillItem {
private Long id;
private Product product;
private Integer number;
private BigDecimal price;
private BigDecimal totalAmount;
//getter & setter
public void count(){
this.totalAmount=this.number*this.price;
}
}
該對(duì)象在實(shí)例化完成后需要調(diào)用count()方法來完成totalAmount屬性的計(jì)算颁股。要完成這個(gè)邏輯么库,只需要讓該類實(shí)現(xiàn)定義的InitialEntity接口即可:
package cd.itcast.mybatis.myobjectfactory;
public class StockOutcomeBillItem implements InitialEntity{
private Long id;
//other properties;
//getter & setter
public void init() {
this.count();
}
private void count(){
this.totalAmount=this.number*this.price;
}
}
接下來,只需要完成能辨別InitialEntity接口的對(duì)象并調(diào)用其中的方法即可:
package cd.itcast.mybatis.myobjectfactory;
public class InitialObjectFactory extends DefaultObjectFactory {
private static final long serialVersionUID = 1L;
@Override
public <T> T create(Class<T> type) {
return super.create(type);
}
@Override
//注意甘有,在DefaultObjectFactory的create(Class type)方法中調(diào)用的是
//create(Class,List<Class> constructorArgTypes,List<Object> constructorArgs)方法诉儒,
//所以,只需要在這個(gè)方法中完成自定義初始化邏輯即可亏掀。
public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes,List<Object> constructorArgs){
T ret= super.create(type, constructorArgTypes, constructorArgs);
//判斷接口類型和執(zhí)行接口方法忱反。
if(InitialEntity.class.isAssignableFrom(type)){
InitialEntity entity=(InitialEntity)ret; entity.init();
}
return ret;
}
}
接下來只需要注冊(cè)這個(gè)ObjectFactory即可:
<!-- mybatis-config.xml -->
<objectFactory type="org.mybatis.example.ExampleObjectFactory"/>
以上就是mybatis中objectfactory的簡(jiǎn)單應(yīng)用泛释,關(guān)于objectfactory更多的實(shí)現(xiàn)細(xì)節(jié),可以通過閱讀mybatis代碼去研究温算。