如何自定义starter

springboot启动流程的系列文章中,我们看过了springboot的自动配置机制,本文将基于自动配置机制自定义一个自动配置的starter示例

正文

模块结构

首先,我们准备两个模块service和web,模块结构如

service模块

在service模块中,我们添加一个服务类TestService

public class TestService {

    public String getName() {
        return "lay";
    }
}

接着再添加一个ServiceAutoConfiguration配置类,将TestService变成一个Bean

public class ServiceAutoConfiguration {

    @Bean
    public TestService testService() {
        return new TestService();
    }
}

还有最重要的一步,将ServiceAutoConfiguration添加到META-INF/spring.factories中成为自动配置类

org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.lay.service.ServiceAutoConfiguration

这样,service就完毕了,我们看看service模块的结构

web模块

我们先在web的pom.xml文件中添加service的模块依赖

<dependency>
    <groupId>cn.lay</groupId>
    <artifactId>service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

再添加一个TestController

@RestController
public class TestController {

    @Autowired
    private TestService testService;

    @GetMapping("getName")
    public String getName() {
        return testService.getName();
    }
}

启动测试

当我们启动web以后,会根据service的META-INF/spring.factories中配置的自动配置类把TestService变成Bean,然后注入到TestController中

我们打开浏览器测试一下

可以看到,我们成功执行获得结果

添加条件化注解

在META-INF/spring.factories中添加配置类,但是很多时候我们希望配置类在满足一些条件的时候才生效,为此我们可以使用@Conditional注解或者组合了@Conditional注解的注解

本例中,我们将在ServiceAutoConfiguration中使用使用@ConditionalOnClass注解,该注解表示当某个类存在的时候配置类才生效

@ConditionalOnClass(name = "java.lang.String")
public class ServiceAutoConfiguration {

    @Bean
    public TestService testService() {
        return new TestService();
    }
}

注解中指明,当String类存在的时候ServiceAutoConfiguration才会进行解析处理,而如果你指明一个不存在的类,如:java.lang.String2,那么TestService将不会被解析成一个Bean

添加properties

我们先在service模块的pom.xml中添加properties处理依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

添加一个配置属性对象

@ConfigurationProperties(prefix = "service")
public class ServiceProperties {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "ServiceProperties{" +
                "name=‘" + name + ‘\‘‘ +
                ‘}‘;
    }
}

在ServiceAutoConfiguration添加为Bean,开启属性自动解析

@ConditionalOnClass(name = "java.lang.String")
@EnableConfigurationProperties(value = {ServiceProperties.class})
public class ServiceAutoConfiguration {

    @Bean
    public TestService testService() {
        return new TestService();
    }
}

把ServiceProperties注入到TestService中

public class TestService {

    @Autowired
    private ServiceProperties serviceProperties;

    public String getName() {
        return serviceProperties.getName();
    }
}

回到web模块,在application.properties中添加配置

service.name=lay

重新启动测试,你会看到浏览器获取到了结果

总结

springboot的自动配置,其实就是包了一层自动发现(spi机制)的spring.factories配置,然后通过@Conditional相关的条件化处理来决定是否进行配置类的解析工作。

原文地址:https://www.cnblogs.com/lay2017/p/11518240.html

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

如何自定义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

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

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