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

// 该类所属的包名，表明其处于管理端相关的包下，作为整个Web应用的启动类所在的位置
package com.yami.shop.admin;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.ComponentScan;

/**
 * @author lgh
 * 这是一个Spring Boot应用的启动类，作为整个Web应用的入口点，负责启动和配置整个应用。
 * 它整合了诸多Spring Boot相关的配置和启动逻辑，使得应用能够按照预设的配置和自动配置机制进行初始化，
 * 加载各种组件、配置缓存（如果启用了缓存功能）以及与外部Servlet容器进行集成（如果以WAR包形式部署）等操作。
 */
// @SpringBootApplication是一个组合注解，相当于同时使用了@Configuration、@EnableAutoConfiguration和@ComponentScan这三个注解，
// 下面分别对其作用进行详细解释：
// @Configuration注解表明这个类是一个Java配置类，可用于定义Spring容器中的Bean以及配置相关的信息，类似于传统的XML配置文件的作用。
// @EnableAutoConfiguration注解开启Spring Boot的自动配置功能，它会根据项目中添加的依赖以及一些默认的配置规则，自动配置Spring应用的各种组件，
// 例如，自动配置数据源、Web相关组件等，极大地减少了手动配置的工作量。
// @ComponentScan注解用于指定Spring要扫描的基础包路径，在这里表示会扫描com.yami.shop及其子包下的所有组件（比如使用@Component、@Service、@Repository、@Controller等注解标注的类），
// 找到这些组件后会将它们纳入Spring容器进行管理，使得它们能够在应用中被自动注入和使用。
@SpringBootApplication
// 通过@ComponentScan注解指定Spring要扫描的基础包路径为com.yami.shop及其子包，确保应用中的各种组件能被正确扫描并加载到Spring容器中进行管理。
@ComponentScan("com.yami.shop")
// @EnableCaching注解用于开启Spring的缓存功能，当应用中需要使用缓存来提高性能，比如缓存数据库查询结果、方法返回值等情况时，启用此注解后，
// 可以通过在相应的方法上使用缓存相关注解（如@Cacheable、@CachePut、@CacheEvict等）来配置缓存策略。在这里表示应用开启了缓存功能，后续可按需配置具体的缓存细节。
@EnableCaching
public class WebApplication extends SpringBootServletInitializer {

    /**
     * 应用的主入口方法，Java应用程序从这里开始执行。
     * 它调用SpringApplication的静态方法run来启动Spring Boot应用，传入当前类（WebApplication.class）作为配置类，以及命令行参数（args）。
     * Spring Boot会基于这个配置类，按照自动配置机制去查找和加载各种配置信息、初始化应用上下文，
     * 然后加载所有被@ComponentScan扫描到的组件，配置各种中间件（如Web服务器，如果是Web应用的话），最终启动整个应用。
     *
     * @param args 命令行参数，可用于在启动应用时传入一些自定义的配置信息或运行参数等，例如指定应用的运行环境（开发、测试、生产等）、端口号等。
     */
    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }

    /**
     * 当应用以WAR包形式部署到外部的Servlet容器（如Tomcat、Jetty等）时，需要重写这个方法来配置Spring应用的启动构建器。
     * 在这里，它返回的SpringApplicationBuilder会指定启动的主类（即WebApplication.class），
     * 这样外部的Servlet容器就能通过这个构建器正确地加载和启动Spring应用，将应用的上下文与容器进行整合，
     * 确保应用能够在外部容器的环境下正常运行，并且能够利用容器提供的各种资源和功能。
     */
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(WebApplication.class);
    }
}