mybatis源码-解析配置文件(三)之配置文件Configuration解析(超详细, 值得收藏) (4)

settingsMyBatis 中极为重要的设置,它们会改变 MyBatis 的运行时行为。

3.3.1.4 解析过程 private Properties settingsAsProperties(XNode context) { if (context == null) { return new Properties(); } // 解析所有的子节点, 并存到 Properties 对象中。 Properties props = context.getChildrenAsProperties(); // Check that all settings are known to the configuration class // 创建对应的 MetaClass 对象 MetaClass metaConfig = MetaClass.forClass(Configuration.class, localReflectorFactory); // 检测 Configuraion 对象中是否定义了相应的 setter 方法, 不定义代表不存在该属性, 直接抛异常 for (Object key : props.keySet()) { if (!metaConfig.hasSetter(String.valueOf(key))) { throw new BuilderException("The setting " + key + " is not known. Make sure you spelled it correctly (case sensitive)."); } } return props; } 3.3.3 typeAliases 相关属性 3.3.3.1 成员变量 protected final TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry(); 3.3.3.2 对应 XML 节点:<typeAliases>

typeAliases, 即类型别名。类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。

3.3.3.3 作用 <typeAliases> <typeAlias alias="Author" type="domain.blog.Author"/> </typeAliases>

类似以上配置, 当需要使用domain.blog.Author时, 我们可以用Author来进行代替。

当开启包扫描之后, 在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。

3.3.3.4 解析过程 private void typeAliasesElement(XNode parent) { if (parent != null) { // 处理全部的子类 for (XNode child : parent.getChildren()) { // 处理 <package> 子节点 if ("package".equals(child.getName())) { // 获取配置处的属性 name , 其对应着包名 String typeAliasPackage = child.getStringAttribute("name"); configuration.getTypeAliasRegistry().registerAliases(typeAliasPackage); } else { // 处理 <typeAlias>节点 String alias = child.getStringAttribute("alias"); String type = child.getStringAttribute("type"); try { Class<?> clazz = Resources.classForName(type); if (alias == null) { // 如果alias没有配置,则按照约定的方式注册类 typeAliasRegistry.registerAlias(clazz); } else { // alias 配置了, 则将类注册到alias typeAliasRegistry.registerAlias(alias, clazz); } } catch (ClassNotFoundException e) { throw new BuilderException("Error registering typeAlias for '" + alias + "'. Cause: " + e, e); } } } } } 3.3.4 plugins 相关属性 3.3.4.1 成员变量 protected final InterceptorChain interceptorChain = new InterceptorChain(); 3.3.4.2 对应 XML 节点:<plugins>

在之前的项目中, 没有配置相应的plugins, 但可以参考使用 Mybatis-PageHelper 的配置

<plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- config params as the following --> <property value="value1"/> </plugin> </plugins> 3.3.4.3 作用

插件是 MyBatis 提供的扩展机制之一,用户可以通过添加自定义插件在 SQL 语句执行过程中的某一点进行拦截。

更具体的后面会专门开一章进行讲解。

3.3.4.4 解析过程 private void pluginElement(XNode parent) throws Exception { if (parent != null) { // 遍历 <pluagins> 下的所有 <plugin> 节点 for (XNode child : parent.getChildren()) { // 获取对应的 <plugin> 中的 interceptor 属性 String interceptor = child.getStringAttribute("interceptor"); // 获取 <plugin> 下的所有 <property> 节点, 并以 name->value 的形式存入 Properties 对象中 Properties properties = child.getChildrenAsProperties(); // 通过反射生成对象 Interceptor interceptorInstance = (Interceptor) resolveClass(interceptor).newInstance(); // 设置拦截器的属性 interceptorInstance.setProperties(properties); // 将拦截器添加到 Configuration 对象中 configuration.addInterceptor(interceptorInstance); } } } 3.3.5 objectFactory 相关属性 3.3.5.1 成员变量 protected ObjectFactory objectFactory = new DefaultObjectFactory(); 3.3.5.2 对应 XML 节点:<objectFactory> <objectFactory type="org.mybatis.example.ExampleObjectFactory"> <property value="100"/> </objectFactory> 3.3.5.3 作用

MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。 如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。

3.3.5.4 解析过程 private void objectFactoryElement(XNode context) throws Exception { if (context != null) { // 获取 <objectFactory> 的type属性 String type = context.getStringAttribute("type"); // 获取 <plugin> 下的所有 <property> 节点, 并以 name->value 的形式存入 Properties 对象中 Properties properties = context.getChildrenAsProperties(); // 通过反射生成对象 ObjectFactory factory = (ObjectFactory) resolveClass(type).newInstance(); // 设置属性 factory.setProperties(properties); // 将 ObjectFactory 对象设置到 Configuration 对象中 configuration.setObjectFactory(factory); } } 3.3.6 objectWrapperFactory 相关属性 3.3.6.1 成员变量 protected ObjectWrapperFactory objectWrapperFactory = new DefaultObjectWrapperFactory(); 3.3.6.2 对应 XML 节点:<objectWrapperFactory> <objectWrapperFactory type=""/> 3.3.6.3 作用

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdsxy.html