node-web-mvc
Version:
node spring mvc
109 lines (108 loc) • 4.64 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.methodBeanNameSymbol = void 0;
/**
* @module DefaultListableBeanFactory
* @description Ioc 容器
*/
const BeanDefinition_1 = __importDefault(require("./BeanDefinition"));
const AbstractBeanFactory_1 = __importDefault(require("./AbstractBeanFactory"));
const BeanDefinitionOverrideException_1 = __importDefault(require("../../errors/BeanDefinitionOverrideException"));
const RuntimeAnnotation_1 = __importDefault(require("../../servlets/annotations/annotation/RuntimeAnnotation"));
const Bean_1 = __importDefault(require("../annotations/Bean"));
const Scope_1 = __importDefault(require("../../servlets/annotations/Scope"));
const Qualifier_1 = __importDefault(require("../annotations/Qualifier"));
const InvalidBeanDefinitionException_1 = __importDefault(require("../../errors/InvalidBeanDefinitionException"));
exports.methodBeanNameSymbol = Symbol('methodBeanNameSymbol');
class DefaultListableBeanFactory extends AbstractBeanFactory_1.default {
constructor() {
super(...arguments);
/**
* 已注册bean定义字典
*/
this.beanDefinitions = new Map();
this.registerdBeanType = new Map();
this.allowBeanDefinitionOverridable = false;
}
containsBeanDefinition(beanName) {
return !!this.getBeanDefinition(beanName);
}
/**
* 根据bean名称获取对应的定义
* @param beanName bean类型
*/
getBeanDefinition(beanName) {
return this.beanDefinitions.get(beanName);
}
/**
* 注册一个bean定义
* @param beanName bean名称
* @param beanDefinition bean定义
*/
registerBeanDefinition(beanName, beanDefinition) {
if (!(beanDefinition instanceof BeanDefinition_1.default)) {
throw new InvalidBeanDefinitionException_1.default(beanDefinition);
}
const overrideDefinition = this.beanDefinitions.get(beanName);
if (overrideDefinition && !this.isBeanDefinitionOverridable(beanName)) {
throw new BeanDefinitionOverrideException_1.default(beanName, beanDefinition, overrideDefinition);
}
this.registerComponentBeanAnnotations(beanDefinition.clazz || beanDefinition.methodClazz);
this.debug('Register Definition:', beanName);
this.beanDefinitions.set(beanName, beanDefinition);
}
/**
* 注册组件的Bean注解定义
* @param clazz
*/
registerComponentBeanAnnotations(clazz) {
if (this.registerdBeanType.has(clazz)) {
return;
}
this.registerdBeanType.set(clazz, true);
const annotations = RuntimeAnnotation_1.default.getAnnotations(Bean_1.default, clazz);
annotations.forEach((anno) => {
var _a, _b;
const scopeAnno = RuntimeAnnotation_1.default.getMethodAnnotation(clazz, anno.methodName, Scope_1.default);
const qualifier = RuntimeAnnotation_1.default.getMethodAnnotation(clazz, anno.methodName, Qualifier_1.default);
const scope = (_a = scopeAnno === null || scopeAnno === void 0 ? void 0 : scopeAnno.nativeAnnotation) === null || _a === void 0 ? void 0 : _a.scope;
const name = ((_b = qualifier === null || qualifier === void 0 ? void 0 : qualifier.nativeAnnotation) === null || _b === void 0 ? void 0 : _b.value) || anno.methodName;
const definition = new BeanDefinition_1.default(clazz, anno.method, scope);
anno.method[exports.methodBeanNameSymbol] = name;
this.registerBeanDefinition(name, definition);
});
}
isBeanDefinitionOverridable(beanName) {
return this.allowBeanDefinitionOverridable;
}
setAllowBeanDefinitionOverridable(value) {
this.allowBeanDefinitionOverridable = value;
}
/**
* 移除一个bean定义
* @param beanName
*/
removeBeanDefinition(beanName) {
if (this.containsBeanDefinition(beanName)) {
this.debug('Remove Definition:', beanName);
const definition = this.beanDefinitions.get(beanName);
this.beanDefinitions.delete(beanName);
return definition;
}
}
/**
* 获取所有已注册的bean定义key
* @returns
*/
getBeanDefinitionNames() {
return this.beanDefinitions.keys();
}
destory() {
super.destory();
this.beanDefinitions.clear();
}
}
exports.default = DefaultListableBeanFactory;