手搓Spring启动器

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

自定义autoconfigure start模块关系

  • 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模块的启动类和测试类

📦Starter模块只需要将auto模块坐标导入,删除启动类和测试类

📦 autoConfiguer模块

  1. 将你需要的redis注入

image-20240817181446358

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

image-20240817182917360

📦test模块

  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,动态的进行配置,如果用户没有配置则默认进行原始的配置

📦autoconfigure模块

  • 新建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());
    }
}

📦test测试模块

image-20240817191018413

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

银河流浪家007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值