自定义 starter 2022-02-28 程序之旅 暂无评论 514 次阅读 ## 自定义 starter > SpringBoot 中的 starter 是一种非常重要的机制,能够抛弃以前复杂的配置,将其同意集成进 start,应用者只需要在 mave 中引入 starter 依赖。 **为什么要自定义 starter** 在我们的日常开发工作中,经常会有一些独立业务之外的配置模块,我们经常将其放到一个特定的包下,然后如果一个工程需要复用这块功能的时候,需要将代码拷贝到另一个工程,重新集成一遍,麻烦至极。如果我们将这些业务代码之外的功能模块封装成一个个 starter,复用的时候只需要将其在 pom.xml 中引用依赖即可,再由 SpringBoot 为我们完成自动装配,就非常轻松。常用案例:动态数据源、登录模块、基于 AOP 技术实现日志切面等。 ### 自定 starter 命名规则 官方建议自定义的 starter 使用 `xxx-spring-boot-starter` 命名规则。一区分 SpringBoot 生态提供的 starter。 ### 实现过程 - 自定义 starter 项目 - 使用 starter #### 自定义 starter 项目 1. 创建 maven 工程,工程名为 mf-spring-boot-starter,导入依赖: ```xml org.springframework.boot spring-boot-autoconfigure 2.2.4.RELEASE ``` 2. 编写 java bean ```java @EnableConfigurationProperties @ConfigurationProperties(prefix = "simplebean") public class SimpleBean { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "SimpleBean{" + "id=" + id + ", name='" + name + '\'' + '}'; } } ``` 3. 编写配置类 ```java @Configuration public class MyAutoConfiguration { static { System.out.println("MyAutoConfiguration init..."); } @Bean public SimpleBean simpleBean() { return new SimpleBean(); } } ``` 4. resource 下创建 /META-INF/spring.factories > META-INF 文件夹目录是手动创建, spring.factories 也是手动创建的文件,在该文件中配置自己的自动配置类。 > > SpringBoot 在启动的时候会去加载我们的 simpleBean 到 IOC 容器中,这其实是一种变形的 SPI 机制。 ```xml org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ mufeng.info.config.MyAutoConfiguration ``` #### 使用 starter 配置文件 ```yaml simplebean.id=1 simplebean.name=lr ``` 依赖 pom ```xml mufeng.info mf-spring-boot-starter 1.0-SNAPSHOT ``` 代码使用 ```java @Autowired private SimpleBean simpleBean; ``` ### 热插拔技术 新增标记类 ConfigMarker ```java public class ConfigMarker { } ``` 新增 EnableRegisterServer 注解 ```java @Target({ElementType.TYPE}) // 可以作用在类、接口、枚举 @Retention(RetentionPolicy.RUNTIME) @Import({ConfigMarker.class}) // 将某个组件类生成实例,添加到容器中 public @interface EnableRegisterServer { } ``` 改造 `MyAutoConfiguration` 新增条件注解 `@ConditionalOnBean(ConfigMarker.class)`,`@ConditionalOnBean` 这个条件注解,前面的意思代表只有当前上下文含有 `ConfigMarker` 对象,被标注的类才能被实例化。 ```java @Configuration @ConditionalOnBean(ConfigMarker.class) // 在上下文中必须存在某个 bean,才会让当前自动配置类生效 public class MyAutoConfiguration { static { System.out.println("MyAutoConfiguration init..."); } @Bean public SimpleBean simpleBean() { return new SimpleBean(); } } ``` 使用的时候,在启动类上新增 `@EnableRegisterServer` 打赏: 微信, 支付宝 标签: spring boot 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。