SpringApplication.run()方法执行流程是怎样的?微服务改AWS Lambda需替换哪些逻辑
Spring Boot
SpringApplication.run()执行流程说明 - 启动环境判定:首先识别当前应用类型,你提供的示例属于Servlet栈Web应用,会初始化对应的Servlet应用上下文,同时加载所有预置的上下文初始化器、应用监听器,解析命令行参数作为配置源。
- 配置类注册:将传入的
AccountsServer.class作为主配置类注册到Spring上下文,Spring会自动扫描该类所在包及子包下的所有Spring注解类(@Component、@Service、@Repository、@RestController等),实例化后存入IoC容器,你代码中@Autowired注入AccountRepository的操作就是在这个阶段完成的。 - 配置加载:读取你代码中指定的
accounts-server配置文件,同时加载系统属性、环境变量等所有配置源,完成Bean的属性注入。 - Web容器启动:对于Servlet栈应用,上下文初始化完成后会启动嵌入式Tomcat,注册所有Controller接口路由,监听配置端口,之后发布应用启动完成事件,触发服务注册到Eureka等后置逻辑,应用进入常驻运行状态接收请求。
迁移AWS Lambda的改造参考
- 原有Spring Boot应用是常驻进程模式,依赖嵌入式Tomcat处理HTTP请求,Lambda是事件驱动的按需执行模式,不需要启动嵌入式Web容器,你画类图时可以直接去掉Tomcat相关、Eureka服务注册相关的依赖模块。
- 不需要完全重写现有业务逻辑,可通过Spring Cloud Function适配AWS Lambda,复用现有Service、Repository层的Bean,仅需替换Controller层的HTTP入口为Lambda的事件处理入口即可。
- 原有主类的
SpringApplication.run()启动逻辑可以替换为Spring Cloud Function AWS适配器的启动逻辑,或者直接实现Lambda的RequestHandler接口作为函数入口,不需要维持常驻进程。
你提供的示例代码如下:
public class AccountsServer { @Autowired protected AccountRepository accountRepository; protected Logger logger = Logger.getLogger(AccountsServer.class.getName()); /** * Run the application using Spring Boot and an embedded servlet engine. * * @param args Program arguments - ignored. */ public static void main(String[] args) { // Default to registration server on localhost if (System.getProperty(RegistrationServer.REGISTRATION_SERVER_HOSTNAME) == null) System.setProperty(RegistrationServer.REGISTRATION_SERVER_HOSTNAME, "localhost"); // Tell server to look for accounts-server.properties or // accounts-server.yml System.setProperty("spring.config.name", "accounts-server"); SpringApplication.run(AccountsServer.class, args); } }
内容的提问来源于stack exchange,提问作者geare
相关产品推荐
相关产品推荐

