-
Notifications
You must be signed in to change notification settings - Fork 110
配置元数据详解
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 属性的配置会封装成 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.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 属性, 可用于关闭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 $注解的支持