源码: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();
}
这个没啥可讲的,关键还是事务的实现,还望求高见啊!