
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
Spring是大多数Java编程开发程序员都需要重点学习的一个编程知识点,而本文我们就通过案例分析来简单了解一下,Spring编程开发并行思路与应用。
适合对代码熟悉,追求更快启动速度的老司机。
为了保证效率和安全,自动挡会进行以下限制:
不会对特定类型的Bean进行异步初始化,参考自动档说明;
对@PostConstruct初始化方式的bean,目前自动档不会自动进行异步初始化,这一点主要是考虑到在class中反射获取@PostConstruct注解方法在极端情况下可能会比较耗时;
Spring本身会对找到的@PostConstruct注解方法进行缓存,但放在private内部类中,无法hook拿到;
如果一个bean在初始化时发现依赖了其他的bean,默认会阻塞等待这个被依赖的bean初始化完成;
另外,有一些bean可能不能安全地进行异步初始化,但自动挡无法自动识别。举个例子:beanA依赖beanB,但是beanA是通过手动set的方式引用了beanB(而不是通过@Autowired、构造器注入等正常方式),在异步初始化beanA时不会等待beanB完成,导致运行异常。
针对以上各种情况,可以进行手动配置。
判断一个bean是否要异步初始化
如何判断一个bean是否有必要进行异步初始化?可以参考初始化任务列表中的waitTime字段(启动统计的任务列表会根据waitTime等待时长进行排序),该字段表示阻塞等待该bean完成初始化的耗时,包括两部分:
在初始化其他bean时,发现依赖了当前的bean,为了保证安全,需要阻塞等待该bean初始化完成;
例如,beanA依赖beanB,beanB依赖beanC,依赖链beanA->beanB->beanC,都进行异步初始化:
在初始化beanA时,发现beanB还未完成初始化,则会等待beanB完成初始化,等待时间会加到beanB的waitTime上;
在初始化beanB时,发现beanC还未完成初始化,则会等待beanC完成初始化,等待时间会加到beanC的waitTime上,同时也会影响beanB的waitTime;
Spring完成了启动,发出了ContextRefreshedEvent事件,但实际上有的bean还未异步初始化完成,也需要阻塞等待其完成,这部分时间也会加到waitTime上;
因此waitTime反映了由于这个bean初始化阻塞的时间,在优化时区分两类情况:
如果这个bean没有进行异步初始化(在启动统计中没有(async)后缀),考虑将其指定进行异步初始化;
如果这个bean已经进行了异步初始化(在启动统计中带有(async)后缀),考虑将其指定跳过阻塞等待,前提是确认其不会影响其他bean,几个参考判断条件:
依赖这个bean的其他bean不会在初始化时就调用必须在当前bean初始化完成后才能使用的功能,这时候跳过等待当前bean是OK的。一般来说,大部分bean是满足这个条件的,例如HSF的provider/consumer,metaq的的producer/consumer等等;
应用启动后,除非手动触发,不会立刻就调用必须初始化完成才能使用的功能;
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。