Skip to content

配置元数据详解

fantasyni edited this page Jul 23, 2014 · 10 revisions

概述

元数据配置包含很多配置信息, 包括构造函数参数注入, 对象属性值, 和容器相关的信息比如初始化方法, 工厂方法等等.

配置风格

在Bearcat中, 元数据配置可以以JSON形式的配置文件例如context.json, 或者是直接写在POJOs的代码文件中. 这两种风格唯一的区别就是 func 属性的不同, 基于代码的元数据配置的 func 属性是当前POJO的构造函数, 即是一个 Function, 而配置文件形式的元数据配置的 func 配置则是一个 String 用于指明构造函数所在的文件的相对位置.

基于代码的元数据配置
car.js

var Car = function() {}

Car.prototype.run = function() {
	console.log('run car...');
	return 'car';
}

// func is the constructor function
module.exports = {
	id: "car",
	func: Car
};

基于配置文件的元数据配置
car.js

var Car = function() {}

Car.prototype.run = function() {
	console.log('run car...');
	return 'car';
}

module.exports = Car;

context.json

{
	"name": "simple",
	"beans": [{
		"id": "car",
		"func": "car"
	}]
}

在bearcat 0.2.10 之后添加了通过$命名的变量名来进行描述配置的支持, 可以完全抛弃在json配置中编写beans配置的烦恼, 直接把配置描述编写在function构造函数里面, bearcat 解析这些配置来进行依赖注入

基于$命名的变量名来进行描述配置
app/car.js (app 文件夹下的car.js)

var Car = function() {
	this.$id = "car"; // 配置id为car
}

Car.prototype.run = function() {
	console.log('run car...');
	return 'car';
}

module.exports = Car;

context.json

{
	"name": "simple",
	"scan": "app"
}

详情请参考$命名的变量依赖注入

配置属性

Bean 属性

Bean 属性的配置会封装成 BeanDefinition 对象.

  • id : 当前容器的唯一性id, 以便容器根据此来查找
  • func : bean 的构造函数
  • order : 当bean是单例时的初始化顺序
  • init : 在构造函数被调用之后执行的init方法, init 方法可以是async异步的
  • destroy : 析构函数, 当容器优雅的关闭的时候, destroy 方法会被调用, 来做一些销毁工作
  • factoryBean : 用于实例化bean的工厂bean的名字
  • factoryMethod : 工厂bean的工厂方法名
  • scope : scope 可以是 singleton 或者是 prototype, 默认情况下是 singleton
  • async : 用于说明init方法是否是异步的, 默认情况下是false
  • abstract : 用于定义一个bean是抽象的, 即不会实例化, 默认情况下是 false
  • parent : 用于定义bean之间的继承关系, 类似于对象之间的继承关系, 子类会继承父类 prototype 里面所没有的method, 值为parent bean id
  • lazy : 用于说明当前bean不需要预实例化, 它会当被容器请求的时候再实例化, 默认情况下它是false
  • args : 构造参数依赖注入, 它是一个数组, 它里面的元素会被封装成为一个BeanWrapper, 它有如下属性:
    • name : 依赖注入元素的名字
    • type : 当type被设置的时候, 这是一个 var 依赖注入, 你可以给 getBean 方法传入参数注入到bean中去
    • value : 依赖注入的值
    • ref : 需要注入的当前容器中的bean的名字
  • props : 对象属性依赖注入, 同 args 依赖注入
  • factoryArgs : 工厂方法依赖注入, 同 args 依赖注入
  • proxy : 用于说明bean是否需要被代理, 默认情况下是true. 当一个bean被AOP拦截的时候Proxy对象是需要的, 然而如果一个bean是基础性的, 就没必要去生成代理对象.
  • aop : 用于说明bean是一个 aspect, 定义着 pointcut 和 advice, 它是一个数组.
    • pointcut : 定义 pointcut 表达式
    • advice : 定义匹配pointcut表达式的advice方法
    • runtime : 设置为true表面目标方法参数会传递给advice方法

Context 属性

Context 属性在像context.json的文件中编写

  • name : 标识项目或者库的名称
  • beans : 标识需要在容器中管理的beans元数据定义
  • scan : 自动扫描路径, 扫描基于代码的元数据配置的beans
  • imports : 定义引用其它的context.json的路径的数组
  • dependencies : 标识在依赖的子模块中有需要被容器管理的beans
  • namespace : 用于标识在context.json定义的beans的命名空间 bearcat内部bean id会以 namespace:id 为唯一标识
    因此如果在依赖注入或者getBean的时候, bean id 为
namespace:id

node.js Env 属性

node.js env 属性, 可用于关闭bearcat某些功能

  • process.env.BEARCAT_LOGGER = 'off'; 关闭 pomelo-logger 对 config/log4js.json 配置的加载
  • process.env.BEARCAT_HOT = 'off'; 关闭bearcat热更新功能, 不会对hot reload path进行监控
  • process.env.BEARCAT_ANNOTATION = 'off'; 关闭bearcat对function $注解的支持