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

package com.yami.shop.api.config;

import cn.hutool.core.lang.Snowflake;
import lombok.AllArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * ApiBeanConfig类在Spring框架应用中扮演着配置类的角色，它的主要职责是对Spring框架中的相关Bean进行配置，
 * 并在整个Spring应用上下文初始化的过程中发挥作用。

 * 通过使用 @Configuration 注解，将这个类标记为Spring的配置类，告知Spring容器在启动时需要扫描并解析这个类中的配置信息，
 * 以此来完成Bean的定义和装配等操作。

 * @AllArgsConstructor 注解则是借助Lombok库的功能，为这个类自动生成一个包含所有参数的构造函数，方便进行依赖注入等操作。

 * 此类核心功能在于创建并配置Snowflake实例这个Bean，Snowflake是一种常用于分布式系统中生成唯一ID的工具，
 * 可以确保在复杂的分布式环境下，生成的ID具有唯一性，满足业务系统对于数据标识唯一性的需求。

 * @author lanhai
 */
@Configuration
@AllArgsConstructor
public class ApiBeanConfig {

    // 通过Lombok生成的构造函数注入ApiConfig实例，ApiConfig实例应该是用于承载和提供配置相关信息的类，
    // 在这里主要是为了获取其中的workerId和datacenterId两个参数，这两个参数对于初始化Snowflake实例至关重要，
    // 它们在分布式环境下帮助确定Snowflake生成唯一ID的工作节点和数据中心标识，从而保证生成的ID在整个分布式系统中是唯一的。
    private final ApiConfig apiConfig;

    /**
     * snowflake方法是一个被 @Bean 注解修饰的方法，在Spring框架中，带有 @Bean 注解的方法用于向Spring容器中注册一个Bean。
     * 具体来说，这个方法的功能是创建并返回一个Snowflake实例作为Spring的Bean，以便Spring容器能够对其进行管理，
     * 并且在其他需要生成分布式唯一ID的地方，可以方便地通过依赖注入的方式获取并使用这个实例。

     * Snowflake实例的初始化需要传入workerId和datacenterId两个参数，这里通过调用apiConfig的相应方法来获取这两个参数，
     * 以此保证Snowflake实例能够依据正确的配置在分布式环境下生成唯一的ID。

     * @return 返回一个配置好的Snowflake实例，这个实例将由Spring容器进行管理，后续在整个应用的其他代码部分，
     * 只要有生成分布式唯一ID的需求，都可以通过依赖注入的方式获取并使用这个实例来完成相应的操作。
     */
    @Bean
    public Snowflake snowflake() {
        // 使用从ApiConfig中获取的workerId和datacenterId来实例化Snowflake对象，确保其在分布式环境下能正确生成唯一ID。
        return new Snowflake(apiConfig.getWorkerId(), apiConfig.getDatacenterId());
    }

}