[Ngbatis源码学习] Ngbatis 源码阅读之 NgbatisContextInitializer

Ngbatis源码学习之 NgbatisContextInitializer

NgbatisContextInitializer 方法主要作用是为了初始化一些配置信息。包括 NebulaPoolConfig 连接池初始化、NgbatisConfig Ngbatis的配置信息初始化、NebulaJdbcProperties 连接配置初始化等。并在初始化时加入了 NgbatisBeanFactoryPostProcessor 前置处理器。

NgbatisContextInitializer 涉及到了 ApplicationContextInitializer 的有关知识,请看上章。

NgbatisContextInitializer 主要执行了 initialize 函数:

@Override
public void initialize(ConfigurableApplicationContext context) {

  Env.classLoader = context.getClassLoader();

  ConfigurableEnvironment environment = context.getEnvironment();

  NebulaPoolConfig nebulaPool = getNebulaPoolConfig(environment);

  NgbatisConfig ngbatisConfig = getNebulaNgbatisConfig(environment);

  // @author: Szt-1 fix #https://github.com/nebula-contrib/ngbatis/pull/54
  if (environment.getProperty("nebula.hosts") != null) {
    NebulaJdbcProperties nebulaJdbcProperties =
            getNebulaJdbcProperties(environment)
                    .setPoolConfig(nebulaPool)
                    .setNgbatis(ngbatisConfig);

    ParseCfgProps parseCfgProps = readParseCfgProps(environment);

    context.addBeanFactoryPostProcessor(
            new NgbatisBeanFactoryPostProcessor(nebulaJdbcProperties, parseCfgProps, context)
    );

  }
}

涉及到了全局环境配置信息和很多关于配置类,以下逐一讲解。

1. Env

EnvNgbatis 存储框架的全局环境信息的类,包括如下参数:

public class Env {

  // 类加载器
  public static ClassLoader classLoader;

  // 使用 fastjson 安全模式,规避任意代码执行风险
  static {
    ParserConfig.getGlobalInstance().setSafeMode(true);
  }

  private Logger log = LoggerFactory.getLogger(Env.class);

  // 模板引擎 默认 beetl
  private TextResolver textResolver;
  // 结果集路由
  private ResultResolver resultResolver;
  // 参数解析器
  private ArgsResolver argsResolver;
  // 参数名格式化器
  private ArgNameFormatter argNameFormatter;
  // 解析的参数配置
  private ParseCfgProps cfgProps;
  // 应用上下文
  private ApplicationContext context;

  // 用户名
  private String username;
  // 密码
  private String password;
  // 连接是否支持重连
  private boolean reconnect = false;
  // 图空间
  private String space;
  // 主键生成器
  private PkGenerator pkGenerator;

  // 本地会话调度器
  private SessionDispatcher dispatcher;
  // xml 中标签所声明的信息或方法类
  private MapperContext mapperContext;
  // ...
}

NgbatisContextInitializer 中将 classLoader 赋值给了 Env 中的类加载器,以供之后使用。

关于 Env 的详解将在另外一篇文章中进行详细描述。

2. NebulaPoolConfig

NebulaPoolConfigNebulaGraph 官方提供的连接池配置类,里面包括了很多配置项:

	// 连接池中的最小连接数
  private int minConnsSize = 0;

  // 连接池中的最大连接数
  private int maxConnsSize = 10;

  // Socket 连接超时时间,单位毫秒
  private int timeout = 0;

  // 连接空闲时间,单位毫秒。当连接空闲时间超过当前数,将被删除。0 则永不删除。
  private int idleTime = 0;

  // 检查空闲连接的间隔时间,单位毫秒。-1 表示不检查。
  private int intervalIdle = -1;

  // 获得空闲连接的等待时间,单位毫秒。
  private int waitTime = 0;

  // 能正常运行的健康服务器在所有服务器中的最小比率。如果是 1 表示所有服务器都健康才能进行初始化。
  private double minClusterHealthRate = 1;

  // 设置为 true 设置 ssl 加密流量。	
  private boolean enableSsl = false;

  // 如果启用 SSL,需要用到的 SSL 参数。
  private SSLParam sslParam = null;

相对应的都可以在 Ngbatisproperties 配置中进行配置:

nebula.pool-config.min-conns-size=0
nebula.pool-config.max-conns-size=10
nebula.pool-config.timeout=0
nebula.pool-config.idle-time=0
nebula.pool-config.interval-idle=-1
nebula.pool-config.wait-time=0

3. NgbatisConfig

NgbatisConfig 是对 Ngbatis 进行了一些简单的配置:

/**
 * yml 配置文件对应ngbatis属性的模型类
 */
public class NgbatisConfig {

  /**
   * session存活有效期
   */
  public Long sessionLifeLength;

  /**
   * session健康检测间隔
   */
  public Long checkFixedRate;
  /**
   * 是否使用 nebula-java 的 session pool 会话池
   */
  public Boolean useSessionPool;
  
  // ...
}

同样相对应的可以在 Ngbatisproperties 配置中进行配置:

nebula.ngbatis.session-life-length=100
ebula.ngbatis.check-fixed-rate=100
nebula.ngbatis.use-session-pool=false

4. NebulaJdbcProperties

NebulaJdbcProperties 主要配置 Ngbatis 有关于 NebulaGraph 的库信息配置数据:

  /**
   * Nebula 地址。由 hosts 切割而来
   */
  private List<HostAddress> hostAddresses;
  /**
   * Nebula 多个库的地址。格式:ip:port, ip:port, ip:port, ....
   */
  private String hosts;
  /**
   * Nebula 连接配置
   */
  private NebulaPoolConfig poolConfig;
  /**
   * ngbatis 自定义配置
   */
  private NgbatisConfig ngbatis;
  /**
   * 数据库用户名
   */
  private String username;
  /**
   * 数据库密码
   */
  private String password;
  /**
   * 当前所有的数据库空间
   */
  private String space;

相对应的可在 Ngbatisproperties 配置中进行配置:

nebula.hosts=127.0.0.1
nebula.username=knqiufan
nebula.password=knqiufan
nebula.space=test

5. ParseCfgProps

将在其他文章中详细说明。

posted @ 2024-03-22 10:19  knqiufan  阅读(52)  评论(0编辑  收藏  举报