j-spring 后置处理器(4)

71 阅读1分钟

源码:j-spring

前言

后置处理器在spring里面,主要就是就是用来对bean的提升的。常见就是对@Service注解的处理,通过cglib代理和threadLocal配合,实现了事务的自动化操作。 因为单线程的原因js实现事务自动化很难,即使是nestjs实现的也不尽如人意。后期做到JPA就必须面对这个难题了,想想就头疼啊。

j-spring的后置处理器的实现

1.首先定义一个集合

//后置处理器集合
const beanPostProcessorList = new Set<BeanPostProcessor>();

//绑定的beanProcessor class
const bindBeanProcessorClazzList = new Set<new()=>BeanPostProcessor>();

2.然后绑定class的时候判定是否是后置处理器,存入集合中。

//判断是否是后置处理器的类
function isBeanPostProcessorClass(clazz:Clazz):boolean{
    const post = new clazz() as BeanPostProcessor
    return isFunction(post.getSort) && isFunction(post.postProcessAfterInitialization) && isFunction(post.postProcessBeforeInitialization);
}

export const addExtBeanClazz = (clazz:Clazz)=>{

    if(isBeanPostProcessorClass(clazz)){
        bindBeanProcessorClazzList.add(clazz)
    }else{
        bindBeanClazzList.add(clazz);
    }
  
}

这里的isBeanPostProcessorClass方法,着实有点弱智,就是创建实例,判断属性。TS的接口只是用于类型推断,实际编译后会清除,所以无法判断类和接口的继承关系。

3.工厂初始化,首先实例化后置处理器。


//实例化后置处理器
const instanceBeanPostProcessor = ()=>{
    Array.from(bindBeanProcessorClazzList).map(assemble).forEach(b => beanPostProcessorList.add(b))
}

export const beanFactoryInit = ()=>{

    //1.首先实例化后置处理器
    instanceBeanPostProcessor();

}

这个没啥可讲的,关键还是事务的实现,还望求高见啊!