
一文读懂Bearcat Bean生命周期初始化、销毁、工厂Bean与抽象父类详解【免费下载链接】bearcatpowered by enhanced javaScript objects项目地址: https://gitcode.com/gh_mirrors/be/bearcatBearcat 是一个让普通 JavaScript 对象POJO自描述的轻量级 IoC 容器框架你只需在对象上声明$id、$init、$destroy等元信息它就能自动完成扫描、依赖注入、Bean 生命周期管理与 AOP 切面增强。本文带你一文读懂 Bearcat Bean 生命周期中最核心的四个环节初始化init、销毁destroy、工厂 BeanfactoryBean与抽象父类abstract parent帮助新手快速掌握 Bean 从出生到死亡的完整过程。什么是 BeanBearcat 中的自描述对象在 Bearcat 里Bean 就是你能直接使用的普通 JavaScript 对象不需要继承任何框架类。一个 Bean 由两部分组成组成部分说明示例构造函数定义对象属性var Car function() {...}元信息告诉容器如何管理它this.$id carBearcat 支持两种声明元信息的方式注解式在构造函数内用$xxx属性声明简洁直观对象字面量式module.exports { func: Car, id: car, initMethod: init, ... }容器启动时会按 examples/simple_init_method/context.json 中scan指定的目录扫描所有 JS 文件把扫描到的对象注册进 IoC 容器。相关实现位于 lib/beans/beanFactory.js 的registerBean方法中。// 注解式声明一个自描述对象 var Car function() { this.$id car; // Bean 名称 this.$scope prototype; // 作用域 this.$init init; // 初始化方法 } Car.prototype.init function() { /* 初始化逻辑 */ } module.exports Car; 完整可运行示例见 examples/simple_init_method/ 目录。Bean 完整生命周期从注册到销毁一图看懂Bearcat 的 Bean 生命周期与 Spring 高度相似共分为6 个阶段① 扫描注册 → ② 预实例化 → ③ 实例化依赖注入 → ④ 初始化 → ⑤ 运行使用 → ⑥ 销毁 register preInstantiate doCreateBean initBean getBean destroyBean下面结合源码逐阶段说明1. 扫描注册registerBean容器加载context.json后扫描目录为每个对象建立BeanDefinitionBean 定义记录它的名称、作用域、初始化方法、销毁方法、工厂方法等全部元信息。2. 预实例化preInstantiateSingletons容器启动时按order排序提前创建所有单例 Bean。异步初始化的 Bean 会等待回调完成后再继续下一个保证初始化顺序可控源码见 lib/beans/beanFactory.js 中preInstantiateSingletons方法。3. 实例化与依赖注入doCreateBean容器执行new语义创建实例并根据$wheel、$engine等注解把依赖的 Bean 注入进来。4. 初始化initBean这是文章重点之一详见下一节。5. 运行期使用业务代码通过bearcat.getBean(car)获取实例。单例 Bean 会缓存在 lib/beans/singletonBeanFactory.js 中重复获取直接返回同一实例。6. 销毁destroySingletons应用关闭时统一销毁详见后文。初始化详解init 方法与 async 异步初始化同步初始化用$init声明在 Bean 中声明$init属性并指向一个方法名容器在实例化和依赖注入完成后自动调用它是执行资源准备、数据预热等逻辑的最佳时机var Car function() { this.$id car; this.$init init; // 声明初始化方法 } Car.prototype.init function() { console.log(init car...); // 容器自动调用 this.num 1; }源码层面initBean的调用顺序非常清晰后置处理器 before → 执行 init 方法 → 后置处理器 after见 lib/beans/beanFactory.js 中initBean方法后置处理器正是 AOP 代理生效的时机。异步初始化用$async声明如果初始化涉及数据库连接、远程加载等耗时操作声明$async: true即可。容器的预实例化流程会挂起等待初始化回调完成再创建下一个 Bean避免依赖未就绪的问题。this.$async true; // 告诉容器init 是异步的等回调 参考 examples/simple_async_init/app/car.js其中还演示了用$order控制初始化顺序$order值越小越先初始化。工厂 Bean 详解把创建权交给工厂方法有些对象的创建过程很复杂需要组合多个部件、做特殊校验这时可以把怎么造从 Bean 本身剥离出去交给一个工厂 Bean的工厂方法来生产。Bearcat 用两个元信息实现$factoryBean指定工厂 Bean 名称$factoryMethod指定工厂方法名。// 工厂 Bean负责造车 var CarFactory function() { this.$id carFactory; this.$wheel null; // 工厂自身也能被注入依赖 } CarFactory.prototype.createCar function() { this.$wheel.run(); // 装配过程中做检查 return new Car(); // 返回成品 } module.exports CarFactory; // 产品 Bean声明由谁造、用什么方法造 var Car function() { this.$id car; this.$factoryBean carFactory; this.$factoryMethod createCar; } module.exports Car;执行流程源码见 lib/beans/beanFactory.js 中getBeanFromFactoryBean方法容器收到对car的请求发现它配置了工厂 Bean于是先获取carFactory实例调用其createCar方法把返回值作为car的实例该实例仍然会走完整的初始化流程init 方法照常执行 完整示例见 examples/simple_factory_bean/app/carFactory.js 和 examples/simple_factory_bean/app/car.js。配置错误时的报错行为可参考 examples/simple_factory_bean_error/ 目录。抽象父类 Bean 详解一份配置多子复用当多个 Bean 共享相同的属性、依赖时比如 Car、Bus、Tank 都依赖 engine 和 wheel可以定义一个抽象父类 Bean父类 Bean 声明abstract: true只作为模板不会被实例化子类 Bean 声明parent: 父类名自动继承父类的 props/args 配置// 抽象父类只做模板不产生实例 module.exports { func: Car, id: car, abstract: true, // 关键声明为抽象 Bean props: [ { name: engine, ref: engine }, // 子 Bean 全部继承这些依赖 { name: num, value: 100 }, { name: wheel, ref: wheel } ] };继承机制由setParentBean方法实现见 lib/beans/beanFactory.js创建子 Bean 时容器会把父类原型上的方法合并到子类原型上子类同名方法优先并继承父类的注入配置。对抽象 Bean 调用getBean会返回其构造函数而非实例容器会打印提示日志abstract bean can not get bean instance——这是新手常踩的坑记得检查abstract配置。 完整示例见 examples/simple_abstract_parent/ 目录其中 beans/car.js 定义了抽象父类Bus、Tank 等子 Bean 各自复用其依赖配置。普通非抽象父类继承可参考 examples/simple_parent_bean/ 目录。销毁详解优雅地释放资源Bean 使用完毕后需要释放资源关闭连接、落盘数据、清理定时器Bearcat 用$destroy声明销毁方法var Car function() { this.$id car; this.$destroy destroy; // 声明销毁方法 } Car.prototype.destroy function() { console.log(destroy car...); // 容器关闭时调用 } module.exports Car;销毁流程源码见 lib/beans/beanFactory.js 中destroySingletons与destroyBean方法容器关闭时遍历所有已创建的单例逐个调用其destroy方法从单例缓存SingletonBeanFactory中移除并清除 Bean 定义⚠️注意只有单例singletonBean会收到销毁回调prototype 作用域的 Bean 每次都是新实例由使用方自行管理生命周期容器不会主动销毁。完整示例见 examples/simple_destroy_method/app/car.js。核心元信息速查表元信息作用典型场景$idBean 的唯一名称所有 Bean 必配$scopesingleton/prototype单例默认原型按需$init初始化方法名资源预热、状态准备$asyncinit 是否异步连数据库、加载远程数据$order初始化顺序小值优先有依赖先后关系的 Bean$destroy销毁方法名释放连接、清理资源$factoryBean/$factoryMethod工厂 Bean / 工厂方法复杂创建逻辑外置abstract/parent抽象模板 / 继承父类多 Bean 共享配置总结新手掌握 Bean 生命周期的 3 个要点顺序不可乱依赖注入 → 初始化 → 使用 → 销毁初始化逻辑一定要写在 init 方法里而不是构造函数里否则依赖可能尚未注入。抽象父类只是模板abstract: true的 Bean 永远不产生实例它是配置复用的利器忘记这一点是新手最常见的困惑来源。工厂 Bean 只换出生方式由工厂方法生产的 Bean 依然享受完整的初始化、AOP 代理和销毁流程生命周期与普通 Bean 完全一致。掌握以上内容后建议动手跑一遍 examples/ 目录下对应场景的示例结合 lib/beans/ 源码中的beanFactory.js与singletonBeanFactory.js你对 Bearcat Bean 生命周期的理解会更加透彻。【免费下载链接】bearcatpowered by enhanced javaScript objects项目地址: https://gitcode.com/gh_mirrors/be/bearcat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考