前言
最近在学习异步编程的过程中,偶然看到Bean的异步加载,之前只用过方法的异步事务、异步回调、异步线程,基本都是针对方法的执行,但是具体涉及到Bean实例的异步加载,还没有在实际开发中应用过,在我的理解Spring boot在项目启动的时候会加载很多bean,比如一些远程配置、数据源,可能会在需要调用的时候,进行使用,如果这个时候在进行加载,是不是就会节约很多资源。
了解Spring的小伙伴应该知道,bean加载避免不了上下文的切换,减少上下文的切换本身就是一种节约CPU资源的方式。
SOFABoot框架
SOFABoot是阿里蚂蚁金服在Spring boot基础上开发的一个升级框架, 可以理解一个中间件,拥有Spring boot没有的类隔离、日志空间隔离的功能,也是最近很火的一个框架,相信在不久的将来会慢慢集成到业务项目中,先来看看它的核心功能通过注解实现Bean的异步加载;
Jar包引入
这边用的是3.18.0版本,引入的时候发现不会和Spring boot,Jar包形成冲突,但是我的Spring-boot.version是2.2.6.RELEASE版本,在启动的时候报错了,初步分析是因为版本太低,与SOFABoot3.0的版本不兼容,需要将Spring-boot.的版本升为3.0以上版本,还需要将jdk版本升为17以上才行;
<dependency> <groupId>com.alipay.sofa</groupId> <artifactId>runtime-sofa-boot-starter</artifactId> <version>3.18.0</version> </dependency>
启动类加载bean
@SpringBootApplication @EnableFeignClients @EnableCustomSwagger2 @EnableHystrix @MapperScan("com.example.system.mapper") public class LxlxxxSystemApplication { public static void main(String[] args) { SpringApplication.run(LxlxxxSystemApplication.class, args); } @Bean(name = "synBean", initMethod = "init") public SynBean synBean() { return new SynBean(); } @Bean(name = "synBean2", initMethod = "init") public SynBean2 synBean2() { return new SynBean2(); } @Bean(name = "synBean", initMethod = "init") @SofaAsyncInit public AsyncBean asyncBean() { return new AsyncBean(); } @Bean(name = "synBean2", initMethod = "init") @SofaAsyncInit public AsyncBean2 asyncBean2() { return new AsyncBean2(); } }
同步的方式记载两个bean,异步的方式需要加上SofaAsyncInit注解实现异步加载。
AsyncInitBeanFactoryPostProcessor 核心类
其核心我理解为,就是通过拦截器将标记为SofaAsyncInit注解的bean放入AsyncTaskExecutor异步线程池里面开启异步任务进行加载,
AsyncInitializeBeanMethodInvoker 主要执行类
这里可以清楚的看到通过拿到注解,获取到方法、方法名、通过Spring的上下文事件监听模式,将Class文件进行反射加载,整个代码还是比较清晰易懂的;有兴趣的小伙伴可以模仿自己写一个,巩固下Spring源码原理;
发表评论 取消回复