MyBatis之配置文件解析_三个工厂的作用及处理
三个工厂简介
mybatis可以定制三个工厂接口ObjectFactory,ObjectWrapperFactory及ReflectorFactory的实现。
ObjectFactory接口,用来创建对象,是创建对象的工厂,mybatis所需的对象都通过ObjectFatory创建,默认实现为DefaultObjectFactory
ObjectWrapperFactory接口,定义了创建ObjectWrapper对象的方法,默认实现为DefaultObjectWrapperObject,ObjectWrapper是一个接口,是对一般对象Object的一个包装。
ReflectorFactory是一个接口,定义了获得Reflector对象的方法,默认实现为DefaultReflectorFactory类,Reflector是一个类,缓存了Class对象的信息。
三个工厂的配置
以上三个工厂类,均可在配置文件中定义,从而使用自定义的工厂类,一般都是使用mybatis提供的默认实现。
<objectFactory type="com.beck.MyObjectFactory"></objectFactory>
<objectWrapperFactory type="com.beck.MyObjectWrapperFactory"></objectWrapperFactory>
<reflectorFactory type="com.beck.MyReflectorFactory"></reflectorFactory>
三个工厂的默认实现类
创建Configuration对象时,默认使用了上面的缺省的工厂对象
public class Configuration {
// 初始化Configuration对象时,创建了默认的工厂对象,所以如果没有配置,则使用对应的实现
protected ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
protected ObjectFactory objectFactory = new DefaultObjectFactory();
protected ObjectWrapperFactory objectWrapperFactory = new DefaultObjectWrapperFactory();
}
三个工厂配置的解析
在XMLConfigBuilder对象中,分别使用objectFactoryElement,objectWrapperFactoryElement,reflectorFactoryElement方法解析配置文件中的元素,其实现逻辑类似,即若有配置,则获取属性type的值,其值对应着相应的类型,通过反射获得对应类型的对象返回
// XMLConfigBuilder用来解析objectFactory,objectWrapperFactory,reflectorFactory元素的方法
private void objectFactoryElement(XNode context) throws Exception {
// 如果没有配置,则使用默认的实现
if (context != null) {
// 获得属性type的值
String type = context.getStringAttribute("type");
Properties properties = context.getChildrenAsProperties();
// 使用反射创建ObjectFactory对象
ObjectFactory factory = (ObjectFactory) resolveClass(type).getDeclaredConstructor().newInstance();
factory.setProperties(properties);
// 使用客户定制的工厂对象
configuration.setObjectFactory(factory);
}
}
private void objectWrapperFactoryElement(XNode context) throws Exception {
if (context != null) {
String type = context.getStringAttribute("type");
ObjectWrapperFactory factory = (ObjectWrapperFactory) resolveClass(type).getDeclaredConstructor().newInstance();
configuration.setObjectWrapperFactory(factory);
}
}
private void reflectorFactoryElement(XNode context) throws Exception {
if (context != null) {
String type = context.getStringAttribute("type");
ReflectorFactory factory = (ReflectorFactory) resolveClass(type).getDeclaredConstructor().newInstance();
configuration.setReflectorFactory(factory);
}
}

浙公网安备 33010602011771号