node-web-mvc
Version:
node spring mvc
60 lines (59 loc) • 2.66 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = hotUpdate;
const src_1 = __importDefault(require("../../hmr/src"));
const RuntimeAnnotation_1 = __importDefault(require("../annotations/annotation/RuntimeAnnotation"));
const Component_1 = __importDefault(require("../../ioc/annotations/Component"));
const Tracer_1 = __importDefault(require("../annotations/annotation/Tracer"));
const BeanDefinition_1 = __importDefault(require("../../ioc/factory/BeanDefinition"));
// 开发模式热更新
function hotUpdate(getBeanFactory, registerWithAnnotation, createSingletonBeans) {
const updateFiles = [];
const removeKeys = [];
src_1.default
.create(module)
.clean()
.preload((old) => {
var _a;
updateFiles.push(old.filename);
const beanFactory = getBeanFactory();
for (const key of beanFactory.getBeanDefinitionNames()) {
const definition = beanFactory.getBeanDefinition(key);
const tracer = Tracer_1.default.getTracer(definition.clazz || definition.methodClazz);
if ((_a = tracer === null || tracer === void 0 ? void 0 : tracer.isDependency) === null || _a === void 0 ? void 0 : _a.call(tracer, old.filename)) {
// 记录需要移除的内容
removeKeys.push(key);
}
}
})
.allDone(() => {
const beanFactory = getBeanFactory();
removeKeys.forEach((key) => {
const definition = beanFactory.getBeanDefinition(key);
if (definition) {
// 移除Bean定义对应的实例对象
beanFactory.removeBeanInstance(definition);
// 移除Bean定义
beanFactory.removeBeanDefinition(key);
}
});
const annotations = RuntimeAnnotation_1.default.getAnnotations(Component_1.default);
annotations.forEach((annotation) => {
const tracer = Tracer_1.default.getTracer(annotation.ctor);
const beanName = BeanDefinition_1.default.toBeanName(annotation.ctor);
if (!tracer)
return;
if (!beanFactory.containsBean(beanName)) {
// console.log('register:', annotation.ctor.name);
// 重新注册热更新过的Bean定义
registerWithAnnotation(annotation);
}
});
createSingletonBeans();
updateFiles.length = 0;
removeKeys.length = 0;
});
}