springboot自定义starter

1.创建普通maven项目或者springboot项目,pom文件引入依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
            <version>2.2.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <version>2.2.7.RELEASE</version>
            <optional>true</optional>
        </dependency>
    </dependencies>

2.创建一个对象,这个对象要使用starter自动配置,随便定义一个对象即可

package com.xxx.service;


public class XxxService {

    //随便定义一个属性
    private String name;

    //随便定义一个方法
    public String getString(String a){
        return name+":"+a;
    }
    //构造方法
    public XxxService(String name){
        this.name = name;
    }

}

3.创建配置类

package com.xxx.config;

import com.xxx.service.xxxService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Description: 描述
 * @Author: xxx
 * @Create: 2022-04-15 11:11
 * @Version: 1.0.0.1
 */
@Configuration //代表这个类是一个配置类,取代xml配置的bean
@ConditionalOnClass(Xxx.class) //表示有XXX.class这个类的时候才生效
@ConfigurationProperties(value = "spring.xxx") //统一前缀,spring.xxx.name就是在配置文件中配置的属性
public class ServiceConfig {

    //获取yml或者properties文件中配置的属性,有一点需要注意,如果写了name属性的get和set方法,则在配置文件中会有提示
    @Value(value = "${name}")
    private String name;

    @Bean//将返回的bean注入到ioc容器
    @ConditionalOnProperty(name = "spring.xxx.name",havingValue = "true",matchIfMissing = true)//name:配置的属性名 havingValue:属性期望值的字符串表示形式 matchIfMissing:如果属性未设置,请指定条件是否应匹配。 默认为false
    public XxxService xxxService(){
        return new XxxService (name);
    }

    @Bean
    @ConditionalOnMissingBean(name = "spring.xxx.name")
    public XxxService xxxService1(){
        return new XxxService (name);
    }

}

4.在resources目录下创建META-INF/spring.factories文件,做如下配置

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.xxx.config.ServiceConfig

其中
org.springframework.boot.autoconfigure.EnableAutoConfiguration是固定配置
com.xxx.config.ServiceConfig是自己写的配置类

5.在另一个项目中引用这个starter,添加依赖

<dependency>
    <groupId>com.xxx</groupId>
    <artifactId>spring-boot-starter-xxx</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

6.在yml或者properties中配置name的属性

spring.xxx.name=xxx

7.启动项目后这个starter中的bean就被加载到当前项目中

那么是什么原理?

这个其实就是springboot的自动装配,首先一个springboot项目的启动类中有两个核心点,一:@SpringBootApplication注解;二:main方法下的SpringApplication.run()方法;

@SpringBootApplication是一个组合注解,包含了

  • @SpringBootConfiguration 与@Configuration功能一样,将类标识为配置类
  • @EnableAutoConfiguration 开启自动配置,引入重要注解@Import
  • @ComponentScan 扫描范围

这三个注解,其中@EnableAutoConfiguration引入重要注解@Import(AutoConfigurationImportSelector.class),引入的类下有一个getCandidateConfigurations方法,会去加载META-INF/spring.factories 下的配置。SpringApplication.run()方法在执行的时候,就会在调用refresh()前,将这些配置信息加载到应用上下文,最终通过refresh方法将bean对象加载到ioc容器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值