作为了一个小菜鸡,真诚发问,sdk和starter有啥差异哇,欢迎咱们谈论区告知!非常感谢

springboot作为java开发者不得不提的一个框架,其中也是有许多装备能够减轻开发者的工作量。

简化了Bean目标注入到IoC容器中的流程(主动安装),装备文件的统一管理。

比方主动安装,引进一个starter就能够实现了,大大减少了代码量,使得coder专心于事务代码。

主动安装原理

首先你需求去熟悉SPI机制

具体的逻辑就不展示了,这儿只展现关键代码。假如需求具体发动逻辑代码的同学谈论走一波,需求多的话就更新。

springboot主动安装的流程

便是跟着A项目的发动,会扫描到@SpringBootApplication注解

该注解里边存在一个@EnableAutoConfiguration注解

EnableAutoConfiguration注解里边又存在一个Import注解

执行selectImports办法,selectImports返回的是装备类的全路径名

装备类从何而来,是根据SPI机制,去classpath下的META-INF目录下找一切的spring.factories文件,然后将一切的spring.factories文件进行解析

主动将我所需求的Bean目标注入到IoC容器里边去,@Configuration@Bean,主动体现在我没有对任何类加前面的两个注解

手写一个starter

1.咱们先新建一个springboot项目,这儿的application.properties和Application发动类都是不需求的

SpringBoot自动装配原理+手写一个starter组件
2.界说一个简单的Boy类

/**
 * @author suncong
 * @Date 2023/2/3 17:24
 */
public class Boy{
    public static Boy create(String name){
        return new Boy(name);
    }
    private String name;
    public Boy(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String say(){
        return name+",Hello World!";
    }
}

3.界说主动装备类

/**
 * @author suncong
 * @Date 2023/2/3 17:26
 */
@ConditionalOnClass(Boy.class) // 加载到Boy这个类的话,就主动安装
@EnableConfigurationProperties(BoyProperties.class)
@Configuration
@Data
@ComponentScan
public class BoyAutoConfiguration {
    /**
     * 将目标交给IOC管理
     * @param boyProperties
     * @return
     */
   @Bean
    Boy boy(BoyProperties boyProperties){
       return new Boy(boyProperties.getName());
   }
}

4.界说ConfigurationProperties类,从装备文件(引证这个starter的项目的装备文件)中读取装备

/**
 * @author suncong
 * @Date 2023/2/3 17:28
 */
@ConfigurationProperties(prefix = "demo.boy")
public class BoyProperties {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

5.META-INF文件

注意这儿的每个包名都要正确!!

比方META_INFspring,factories便是错的(别问我怎样知道的…)

additional-spring-configuration-metadata.json

这个文件可写可不写,主要是界说装备信息的内容(指定demo.boy.name有必要是String类型)

{
  "properties": [
    {
      "name":  "demo.boy.name",
      "type":"java.lang.String",
      "description": "想跳舞的人",
      "defaultValue": "sc"
    }
  ]
}

spring.factories 这个文件有必要写,装备主动安装的类的路径

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.sc.demo.BoyAutoConfiguration

6.打包

SpringBoot自动装配原理+手写一个starter组件

这样的话,本地的maven库房就有了这个jar包(后续能够上传库房或许直接发jar给别人用)

7.再新建一个springboot项目

界说发动类和装备类

/**
 * @author SunCong
 */
@RestController
@SpringBootApplication
public class Demo1Application {
    public static void main(String[] args) {
        SpringApplication.run(Demo1Application.class, args);
    }
    @Autowired
    private com.sc.demo.Boy boy;
    @GetMapping("/say")
    public String say(){
        return boy.say();
    }
}

application.properties:

# 使用称号
spring.application.name=demo1
server.port=8081
demo.boy.name="scscsc"

pom.xml:

    <dependency>
        <groupId>com.sc</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

SpringBoot自动装配原理+手写一个starter组件
8.测验

SpringBoot自动装配原理+手写一个starter组件

咱们也能够修改装备文件

# 使用称号
spring.application.name=demo1
server.port=8081
demo.boy.name="shuaige"

SpringBoot自动装配原理+手写一个starter组件

搞定!!!

两类starter的差异

咱们注意到有这么两个starter:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.2</version>
</dependency>

一个是xxx-starter, 一个是stater-xxx

差异: 1.starter命名规矩不一样(如上) 2.xxx-starter是第三方的,主动装备类在

SpringBoot自动装配原理+手写一个starter组件

starter-xxx是官方的,主动装备类在

SpringBoot自动装配原理+手写一个starter组件

最终,感谢您的观看!欢迎点赞 重视,谈论出本文的不足之处