import {BEAN_OPTION, COMPONENT_TYPE, SCAN_TYPE} from "../@types/types"; import "reflect-metadata" import {applicationContext} from "../context/ApplicationContext"; export default function Bean(_option?:BEAN_OPTION){ return function(constructor:T) { let option:BEAN_OPTION = { SCOPE:"singleton", SUBTYPE:"" } if(_option) Object.assign(option, _option); option.MODULE_NAME = `${constructor.name}`; const BEAN = class extends constructor { constructor(...args: any) { let classScope = option.SCOPE const protos = [constructor.prototype, Object.getPrototypeOf(constructor).__proto__]; protos.forEach((proto)=>{ if(!proto) return; Object.keys(proto).forEach((item) => { if(item.indexOf("__") == 0 && item.lastIndexOf("__") == item.length-2){ proto[item].INVOKE(classScope); } }); }) super(...args); } }; applicationContext.addScanBean(BEAN, COMPONENT_TYPE.BEAN, option); return BEAN; }; }