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号
浙公网安备 33010602011771号