/*
 * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
 *
 * https://www.mall4j.com/
 *
 * 未经允许，不可做商业用途！
 *
 * 版权所有，侵权必究！
 */

// 声明该类所在的包名，在Java中包用于对类进行组织和分类管理，方便代码的模块化以及避免类名冲突等问题。
package com.yami.shop.api;

// 引入Spring Boot相关的核心注解，用于标记这是一个Spring Boot应用程序，它会开启Spring Boot的自动配置等一系列功能，简化Spring应用的搭建和部署流程。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// 用于以编程方式构建Spring Boot应用程序，特别是在需要对应用的启动配置等进行更多定制化操作时会用到，比如配置应用的启动类、配置文件等信息。
import org.springframework.boot.builder.SpringApplicationBuilder;
// Spring Boot提供的一个用于支持将Spring Boot应用部署为Web应用（例如部署到Servlet容器中）的基础类，通常需要继承它来做相关的适配和初始化工作。
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
// 用于指定Spring需要扫描的组件所在的基础包路径，Spring会在这些包及其子包下查找带有相关注解（如 @Component、@Service等）的类，并将它们注册为Spring容器中的组件，便于进行依赖注入等操作。
import org.springframework.context.annotation.ComponentScan;

/**
 * @author lgh
 * 该类是整个API应用的启动类，负责启动Spring Boot应用，配置相关的组件扫描以及支持将应用部署到Servlet容器等功能。
 */
@SpringBootApplication
// 通过 @ComponentScan 注解指定Spring要扫描的基础包路径为 "com.yami.shop"，意味着Spring会在这个包及其子包下查找并注册各种Spring组件（如控制器、服务类、数据访问层等）到Spring容器中，以便进行后续的依赖注入和业务逻辑处理。
@ComponentScan(basePackages = {"com.yami.shop"})
public class ApiApplication extends SpringBootServletInitializer {

	// 应用的主入口方法，Java应用程序从这个方法开始执行。当运行这个类的 main 方法时，会启动Spring Boot应用，加载配置、初始化Spring容器并启动相关的Web服务等（如果是Web应用的话）。
	public static void main(String[] args) {
		// 使用SpringApplication类的静态方法 run 来启动Spring Boot应用，传入当前启动类（ApiApplication.class）以及命令行参数 args，Spring Boot会根据配置自动完成一系列的初始化和启动操作。
		SpringApplication.run(ApiApplication.class, args);
	}

	// 重写SpringBootServletInitializer类中的configure方法，用于配置Spring Boot应用在Servlet容器中的启动方式，这里返回一个SpringApplicationBuilder对象，并指定应用的启动类为ApiApplication.class，以便在Servlet容器中正确地启动Spring Boot应用。
	@Override
	protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
		return builder.sources(ApiApplication.class);
	}
}