自定义starter

1.前言

  • springboot的最强大的就是那些xxxAutoconfiguration,但是这些xxxAutoConfiguration又依赖那些starter,只有导入了这些场景启动器(starter),我们很多自动配置类才能有用,并且还会新增一些功能。
  • 我们要用一个场景(比如web),直接导入下面所示的依赖,但是在jar包里面去看这个,你会发现里面只有一些基本的配置文件,什么类都没有,就能够想到这个一类就类似一个公司前台的作用,通过这个公司前台,能够联系到公司内部。
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

2.创建项目

2.1 创建一个空项目,在此基础上创建两个maven项目,具体见下图。

  • db-spring-boot-starter用于编写自定义的starter
  • test-db-spring-boot-starter用于测试

3.写xxxconfiguration里面的逻辑

3.1 配置目录结构

3.2 HelloProperties

@Data
@ConfigurationProperties(prefix = "db.hello")  //配置文件的前缀
public class HelloProperties {
    private String before;
    private String after;

}
  • 这个配置类将 application.properties 中配置的属性值直接注入到这个实例中, @ConfigurationProperties 类型安全的属性注入,即将 application.properties 文件中前缀为 "db.hello"的属性注入到这个类对应的属性上

3.3 HelloWorld

  • 此时这个类和properties类还没什么关系,必须要让第三方传入properties

    @Data
    public class HelloWorld {
        private HelloProperties properties;
    
        public String sayHelloWorld(String name) {
            return properties.getBefore() + ":" + name + "," + properties.getAfter();
        }
    }

3.4 HelloWorldAutoconfiguration

@Configuration //配置类
@ConditionalOnWebApplication //判断当前是web环境
@EnableConfigurationProperties(HelloProperties.class) //向容器里导入HelloProperties
public class HelloWorldAutoConfiguration {

    @Autowired
    HelloProperties properties;  //从容器中获取HelloProperties组件

    /**
     * 从容器里获得的组件传给HelloWorld,然后再将
     * HelloWorld组件丢到容器里
     * @return
     */
    @Bean
    public HelloWorld helloWorld() {
        HelloWorld helloWorld = new HelloWorld();
        helloWorld.setProperties(properties);
        return helloWorld;
    }
}
  • 首先 @Configuration 注解表明这是一个配置类。
  • @EnableConfigurationProperties 注解是使我们之前配置的 @ConfigurationProperties 生效,让配置的属性成功的进入 Bean 中。
  • @ConditionalOnWebApplication 表示当前项目是WEB项目的条件下,后面的配置才生效。
  • 自动配置类中首先注入 HelloProperties ,这个实例中含有我们在 application.properties 中配置的相关数据。
  • 提供一个 helloWorld的实例,将 helloWorld中的值注入进去。

做完这一步之后,我们的自动化配置类就算是完成了

3.5 spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.n3.db.HelloWorldAutoConfiguration

3.6 把这两个安装到maven本地仓库

  • 先是xxautoconfiguration,然后再starter

  • 到此为止,一个简单的HelloWorid的starter就做出来了,我们只需要在我们的项目中导入那个starter(也就是前台唯一的作用)的依赖,就可以了,看看我的starter的坐标(还要记住,properties文件配置的@ConfigurationProperties(prefix = "db.hello"),这个prefix是可以在我们项目里面配置文件配置属性~~)

4.测试

4.1 新建一个测试模块,导入我们自己的starter的坐标

4.2 修改配置

4.3编写controller

@Controller
public class TestController {

    @Autowired
    HelloWorld helloWorld;

    @RequestMapping("/hello")
    @ResponseBody
    public String sayHello() {
        return helloWorld.sayHelloWorld("test");
    }
}

4.4 启动 主启动类,浏览器访问

  • 浏览器访问成功。

4.5 总结

  • Spring Boot在启动时扫描项目所依赖的JAR包,寻找包含spring.factories文件的JAR包,
  • 然后读取spring.factories文件获取配置的自动配置类AutoConfiguration
  • 然后将自动配置类下满足条件(@ConditionalOnXxx)的@Bean放入到Spring容器中(Spring Context)
  • 这样使用者就可以直接用来注入,因为该类已经在容器中了

原文地址:https://www.cnblogs.com/gaofeng-d/p/11745217.html

时间: 2024-10-16 20:12:44

自定义starter的相关文章

小代学Spring Boot之自定义Starter

想要获取更多文章可以访问我的博客?-?代码无止境. 使用Spring Boot框架一段时间之后的小代同学,发现在Spring Boot项目中经常会引入各种各样的Starter,例如Web项目的spring-boot-starter-web以及集成MyBatis时的mybatis-spring-boot-starter.那么这个Starter到底是些什么呢? 什么是Starter 经过一番研究,小代同学了解到Starter主要是Spring Boot用来简化项目依赖的一种形式,比如spring-b

springboot核心技术(四)-----Docker、数据访问、自定义starter

Docker 1.简介 Docker是一个开源的应用容器引擎:是一个轻量级容器技术: Docker支持将软件编译成一个镜像:然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使 用这个镜像: 运行中的这个镜像称为容器,容器启动是非常快速的. 2.核心概念 docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上): docker客户端(Client):连接docker主机进行操作: docker仓库(Registry):用来保存各种打包好的软件

spring boot自定义starter

使用spring boot开发微服务后,工程的数量大大增加(一定要按照领域来切,不要一个中间件客户端包一个),让各个jar从开发和运行时自包含成了一个重要的内容之一.spring boot starter就可以用来解决该问题(没事启动时别依赖于applicationContext.getBean获取bean进行处理,依赖关系太折腾,有时候在复杂系统中解决此事比较麻烦,需要修改开源框架代码才能实现,反过来修改开源源码后,维护也是个麻烦事).言归正传,说说自定义starter.首先请熟悉spring

SpringBoot1.x之启动配置原理及自定义starter

1 启动配置原理 1.1 创建SpringApplication对象 @SuppressWarnings({ "unchecked", "rawtypes" }) private void initialize(Object[] sources) { //保存主配置类 if (sources != null && sources.length > 0) { this.sources.addAll(Arrays.asList(sources));

Spring boot 自定义starter

以下配置来自尚硅谷.. 常用如何配置 @Configuration //指定这个类是一个配置类 @ConditionalOnXXX //在指定条件成立的情况下自动配置类生效 @AutoConfigureAfter //指定自动配置类的顺序 @Bean //给容器中添加组件 @ConfigurationPropertie结合相关xxxProperties类来绑定相关的配置 @EnableConfigurationProperties //让xxxProperties生效加入到容器中 自动配置类要能

springboot自定义starter

1,创建一个空工程 2,new一个Modules  ---------------- maven (启动器) : springboottest-spring-boot-starter 3,new一个Modules  ---------------- spring(做自动配置的): springboottest-spring-boot-starter-autoconfigurer 4,启动器pom文件中引入自动配置模块: <!--启动器--> <dependencies> <!

如何自定义starter

在springboot启动流程的系列文章中,我们看过了springboot的自动配置机制,本文将基于自动配置机制自定义一个自动配置的starter示例 正文 模块结构 首先,我们准备两个模块service和web,模块结构如 service模块 在service模块中,我们添加一个服务类TestService public class TestService { public String getName() { return "lay"; } } 接着再添加一个ServiceAuto

SpringBoot系列之自定义starter实践教程

Springboot是有提供了很多starter的,starter翻译过来可以理解为场景启动器,所谓场景启动器配置了自动配置等等对应业务模块的一个工程,有需要时候直接引入项目就可以,比如需要使用rabbitMQ,直接引入spring-boot-starter-activemq既可,详细介绍可以参考Springboot官方文档关于starters的介绍 查看官方文档,可以找到如下的命名规范: 其意思是SpringBoot官方的starter命名要定义为spring-boot-starter-*,自

springboot之自定义starter

1.创建一个Empty Project 2.在该工程中点击+,选择new module,新建一个maven工程 点击确定. 3.在该工程中点击+,选择new module,新建一个Spring Initializr工程 后面直接默认next,然后点击finishi. 两个都创建完毕之后点击apply,点击OK.得到如下结构: 4.在gong-spring-boot-starter中引入gong-spring-boot-starter-autoconfigurer,即在gong-spring-bo