SpringBoot 自定义starter

目录

IDEA使用Spring initializr 创建SpringBoot项目超时

自定义starter

1、starter启动原理

2、自定义starter

3、总结:


IDEA使用Spring initializr 创建SpringBoot项目超时

创建时用阿里的service url:     https://start.aliyun.com

SpringBoot 自定义starter_第1张图片

自定义starter

面试时,面试官可能会问你如何 实现一个自定义的 SpringBoot starter,或者说,springboot 如何加载我们自己的 jar 包

1、starter启动原理

  • starter-pom引入 autoconfigurer 包

image

  • autoconfigure包中配置使用 META-INF/spring.factoriesEnableAutoConfiguration 的值,使得项目启动加载指定的自动配置类
  • 编写自动配置类 xxxAutoConfiguration -> xxxxProperties
    • @Configuration
    • @Conditional
    • @EnableConfigurationProperties
    • @Bean
    • ......

引入starter --- xxxAutoConfiguration --- 容器中放入组件 ---- 绑定xxxProperties ---- 配置项

2、自定义starter

创建一个名为 boot-09-customer-starter 空工程,工程下面新建两个模块

  • hello-spring-boot-starter(场景启动器,普通Maven工程),
  • hello-spring-boot-starter-autoconfigure(自动配置包,需用用到Spring Initializr创建的Maven工程)。

  • hello-spring-boot-starter无需编写什么代码,只需让该工程引入hello-spring-boot-starter-autoconfigure依赖:


    4.0.0

    com.demo
    hello-spring-boot-starter
    1.0-SNAPSHOT

    
        
        
            com.demo
            hello-spring-boot-starter-autoconfigure
            0.0.1-SNAPSHOT
        
    

  • hello-spring-boot-starter-autoconfigure 的pom.xml如下:


    4.0.0
    com.demo
    hello-spring-boot-starter-autoconfigure
    0.0.1-SNAPSHOT
    hello-spring-boot-starter-autoconfigure
    Demo project for Spring Boot

    
        org.springframework.boot
        spring-boot-starter-parent
        2.4.0
         
    

    
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter
        
    


hello-spring-boot-starter-autoconfigure 的项目结构如下

SpringBoot 自定义starter_第2张图片

package com.demo.hello.auto;

import com.demo.hello.bean.HelloProperties;
import com.demo.hello.service.HelloService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author chenjianbing
 * @create 2021-09-19 19:08
 * 自动配制类
 */
@Configuration
/**
 * EnableConfigurationProperties的作用
 * 1、开启HelloProperties配置绑定功能
 * 2、把这个HelloProperties这个组件自动注册到容器中
 */
@EnableConfigurationProperties(HelloProperties.class)
public class HelloServiceAutoConfiguration {
    
    @ConditionalOnMissingBean(HelloService.class)//当容器中没有时
    @Bean //@Bean 用在方法上,告诉Spring容器,你可以从下面这个方法中拿到一个Bean
    public HelloService helloService(){
        HelloService helloService = new HelloService();
        return helloService;
    }

}
package com.demo.hello.bean;

import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * @author chenjianbing
 * @create 2021-09-19 18:52
 * 将properties文件中的内容,封装到JavaBean中,以供随时使用
 */
@ConfigurationProperties("bingge.hello")
public class HelloProperties {

    private String prefix;
    private String suffix;

    public String getPrefix() {
        return prefix;
    }

    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }

    public String getSuffix() {
        return suffix;
    }

    public void setSuffix(String suffix) {
        this.suffix = suffix;
    }
}
package com.demo.hello.service;

import com.demo.hello.bean.HelloProperties;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * @author chenjianbing
 * @create 2021-09-19 18:47
 * 默认不要放在容器中
 */
public class HelloService {

    @Autowired
    HelloProperties helloProperties;

    public String sayHello(String userName) {
        return helloProperties.getPrefix() + ": "+userName+">"+helloProperties.getSuffix();
    }
}

spring.factories

在spring.factories中显示指定这些配置类的目录,注意“,”后不要有空格之类的符号,就只写该类的全路径,不然会出现无法找到此bean的错误。

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.demo.hello.auto.HelloServiceAutoConfiguration

SpringBoot 自定义starter_第3张图片

用maven插件,将两工程install到本地。记得要把 hello-spring-boot-starter-autoconfigure 的 test 包删除

接下来,测试使用自定义starter,用Spring Initializr创建名为boot-09-customer-starter-test工程,引入hello-spring-boot-starter依赖,其pom.xml如下:



    4.0.0
    com.example
    boot-09-customer-starter-test
    0.0.1-SNAPSHOT
    boot-09-customer-starter-test
    Demo project for Spring Boot

    
        1.8
        UTF-8
        UTF-8
        2.4.1
    

    
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
        
            com.demo
            hello-spring-boot-starter
            1.0-SNAPSHOT
        
    

    
        
            
                org.springframework.boot
                spring-boot-dependencies
                ${spring-boot.version}
                pom
                import
            
        
    

    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                3.8.1
                
                    1.8
                    1.8
                    UTF-8
                
            
            
                org.springframework.boot
                spring-boot-maven-plugin
                2.4.1
                
                    com.example.boot.Boot09CustomerStarterTestApplication
                
                
                    
                        repackage
                        
                            repackage
                        
                    
                
            
        
    

  • 添加配置文件 application.properties 
# 应用名称
spring.application.name=boot-09-customer-starter-test
# 应用服务 WEB 访问端口
server.port=8080
bingge.hello.prefix=江西
bingge.hello.suffix=你好
  • 添加 HelloController
package com.example.boot.controller;

import com.demo.hello.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author chenjianbing
 * @create 2021-09-19 20:26
 */

@RestController
public class HelloController {
    @Autowired
    HelloService helloService;

    @GetMapping("hello")
    public String sayHello(){
        String s = helloService.sayHello("张三");
        return s;
    }
}

启动服务

SpringBoot 自定义starter_第4张图片

3、总结:

第一步,创建xxx-spring-boot-starter工程

第二步,引入 Spring Boot 的基础依赖

第三步,创建xxxAutoConfiguration

SpringBoot 自定义starter_第5张图片

第四步,在xxx-spring-boot-starter工程的 resources 包下创建META-INF/spring.factories文件

可能遇到的问题

springboot 自定义starter的过程以及遇到的问题

你可能感兴趣的:(Spring,Boot,spring,boot,spring,java)