0
点赞
收藏
分享

微信扫一扫

如何在分布式环境中实现高可靠性分布式锁

程序小小黑 2024-08-21 阅读 24

Spring自定义启动器

实现需求:当引入包之后,直接可以使用jedis,jedis已经被注入,可以直接使用

starter是 SpringBoot中的非常重要的机制,他可以将繁杂的配置同意集成到starter中,使用者只需要将 starter引入依赖包,SpringBoot就可以自动加载默认配置啦~

首先自定义启动器是有规范的哦,模仿Spring官方的starter就是spring-boot-start-.....,那么我们为了与第三方和我们手搓启动器则有另一套规范,.....-Spring-Boot-Start,例如我们使用的redis-Spring-Boot-Start的redis等等

Spring官方建议我们自己定义时候,创建两个Modelauto Configure 和 ModelStart

  • starter模块和autoConfigure模块 不需要 测试类启动类 记得删除

  • starter模块

    • 依赖加载autoConfigure模块
  • autoConfigure模块

    • 1️⃣依赖加载jedis 模块(实现java直接使用redis)
    • 2️⃣在项目文件下新建配置类RedisConfiguration类使用@configuration注解将这个类注入为配置类,使用@Bean注解将Jedis装配到Spring中,并配置端口访问路径
    • 3️⃣由于Springboot的自动配置是基于SpringFactories机制实现的,因此我们自定义starter时,同样需要再项目路径之下创建一个Spring.factories文件,在autoConfigure模块的resource文件下创建META-INF文件夹中创建一个spring.factories文件
  • starter模块引入依赖
  • 在启动类中实例化对象,新建一个Jedis对象,测试打印的控制台,是否有消息。
代码实现:

starter模块和autoconfigure模块的依赖关系:

image-20240817175316440

👉 注意:需要删除autoConfig模块和starter模块的启动类和测试类

  1. 将你需要的redis注入

image-20240817181446358

  1. autoConfigure模块的resource文件下创建META-INF文件夹中创建一个spring.factories文件,进行需要扫描注入的配置类,该配置文件中定义了大量的配置类,当 SpringBoot 应用启动时,会自动加载这些配置类,初始化Bean

image-20240817182917360

  1. 引入📦starter模块
  2. 在启动类中直接获取使用是否,启动之后就已经将bean注了容器,是否启用就有jedis对象
@SpringBootApplication
public class SpringBootHighRedisDemoApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(SpringBootHighRedisDemoApplication.class, args);
        Jedis bean = run.getBean(Jedis.class);
        System.out.println(bean);
    }

}

🆗 优化:让用户使用yml文件就可以自己配置端口号和服务器url,动态的进行配置,如果用户没有配置则默认进行原始的配置

  • 新建RedisProperties
@ConfigurationProperties(prefix = "spring.redis")
public class RedisProperties {
    private String host="localhost";
    private int port=6379;

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }
}
  • 在RedisAutoconfiguration类中使用@EnableConfigurationProperties(RedisProperties.class)读取RedisProperties类中的读取properties中的属性(进行批量注入)
@Configuration
//启用带有@ConfigurationProperties的配置类
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoconfiguration {
    //注入jedis
    @Bean
    public Jedis jedis(RedisProperties redisProperties){
        return new Jedis(redisProperties.getHost(),redisProperties.getPort());
    }
}

image-20240817191018413

举报

相关推荐

0 条评论