(7)java Spring Cloud+Spring boot+mybatis企业快速开发架构之SpringCloud-Spring Boot Starter的介绍及使用

2021年09月15日 阅读数:4
这篇文章主要向大家介绍(7)java Spring Cloud+Spring boot+mybatis企业快速开发架构之SpringCloud-Spring Boot Starter的介绍及使用,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

 Spring Boot 的便利性体如今,它简化了不少烦琐的配置,这对于开发人员来讲是一个福音,经过引入各类 Spring Boot Starter 包能够快速搭建出一个项目的脚手架推荐分布式架构源码html

目前提供的 Spring Boot Starter 包有:java

spring-boot-starter-web:快速构建基于 Spring MVC 的 Web 项目,使用 Tomcat 作默认嵌入式容器。
spring-boot-starter-data-redis:操做 Redis。
spring-boot-starter-data-mongodb:操做 Mongodb。
spring-boot-starter-data-jpa:操做 Mysql。
spring-boot-starter-activemq:操做 Activemq。
……web

自动配置很是方便,当咱们要操做 Mongodb 的时候,只须要引入 spring-boot-starter-data-mongodb 的依赖,而后配置 Mongodb 的连接信息 spring.data.mongodb.uri=mongodb://localhost/test 就可使用 MongoTemplate 来操做数据,MongoTemplate 的初始化工做所有交给 Starter 来完成。redis

自动配置麻烦的是当出现错误时,排查问题的难度上升了。自动配置的逻辑都在 Spring Boot Starter 中,要想快速定位问题,就必须得了解 Spring Boot Starter 的内部原理。接下来咱们本身动手来实现一个 Spring Boot Starter。spring

Spring Boot Starter项目建立
建立一个项目 spring-boot-starter-demo,pom.xml 配置代码以下所示。sql

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

 

建立一个配置类,用于在属性文件中配置值,至关于 spring.data.mongo 这种形式,代码以下所示。mongodb

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

@Data
@ConfigurationProperties("spring.user")
public class UserPorperties {
    private String name;
}

 

再定义一个 Client,至关于 MongoTemplate,里面定一个方法,用于获取配置中的值,代码以下所示。json

public class UserClient {
    private UserPorperties userPorperties;

    public UserClient() {

    }

    public UserClient(UserPorperties p) {
        this.userPorperties = p;
    }

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

 

自动建立客户端
一个最基本的 Starter 包定义好了,但目前确定是不能使用 UserClient,由于咱们没有自动构建 UserClient 的实例。接下来开始构建 UserClient,代码以下所示。架构

@Configuration
@EnableConfigurationProperties(UserPorperties.class)
public class UserAutoConfigure {

    @Bean
    @ConditionalOnProperty(prefix = "spring.user", value = "enabled", havingValue = "true")
    public UserClient userClient(UserPorperties userPorperties) {
        return new UserClient(userPorperties);
    }
}

 

Spring Boot 会默认扫描跟启动类平级的包,假如咱们的 Starter 跟启动类不在同一个主包下,如何能让 UserAutoConfigure 生效?app

在 resources 下建立一个 META-INF 文件夹,而后在 META-INF 文件夹中建立一个 spring.factories 文件,文件中指定自动配置的类:
 

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.cxytiandi.demo.UserAutoConfigure

 

Spring Boot 启动时会去读取 spring.factories 文件,而后根据配置激活对应的配置类,至此一个简单的 Starter 包就实现了。

使用 Starter
如今能够在其余的项目中引入这个 Starter 包,代码以下所示。

<dependency>
    <groupId>com.cxytiandi</groupId>
    <artifactId>spring-boot-starter-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

 

引入以后就直接可使用 UserClient,UserClient 在项目启动的时候已经自动初始化好,代码以下所示。

@RestController
public class UserController {

    @Autowired
    private UserClient userClient;

    @GetMapping("/user/name")
    public String getUserName() {
        return userClient.getName();
    }
}

 

属性文件中配置 name 的值和开启 UserClient:

spring.user.name=zhangsan
spring.user.enabled=true

 

访问 /user/name 就能够返回咱们配置的 zhangsan。

使用注解开启 Starter 自动构建
不少时候咱们不想在引入 Starter 包时就执行初始化的逻辑,而是想要由用户来指定是否要开启 Starter 包的自动配置功能,好比经常使用的 @EnableAsync 这个注解就是用于开启调用方法异步执行的功能。

一样地,咱们也能够经过注解的方式来开启是否自动配置,若是用注解的方式,那么 spring.factories 就不须要编写了,下面就来看一下怎么定义启用自动配置的注解,代码以下所示。
 

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({UserAutoConfigure.class})
public @interface EnableUserClient {

}

 

这段代码的核心是 @Import({UserAutoConfigure.class}),经过导入的方式实现把 UserAutoConfigure 实例加入 SpringIOC 容器中,这样就能开启自动配置了。

使用方式就是在启动类上加上该注解,代码以下所示。

@SpringBootApplication
public class SpringBootDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoApplication.class, args);
    }
}

 

使用配置开启 Starter 自动构建
在某些场景下,UserAutoConfigure 中会配置多个对象,对于这些对象,若是不想所有配置,或是想让用户指定须要开启配置的时候再去构建对象,这个时候咱们能够经过 @ConditionalOnProperty 来指定是否开启配置的功能,代码以下所示。
 

@Bean
@ConditionalOnProperty(prefix = "spring.user",value = "enabled",havingValue = "true")
public UserClient userClient(UserPorperties userPorperties) {
    return new UserClient(userPorperties);
}

 

经过上面的配置,只有当启动类加了 @EnableUserClient 而且配置文件中 spring.user.enabled=true 的时候才会自动配置 UserClient。

配置 Starter 内容提示
在自定义 Starter 包的过程当中,还有一点比较重要,就是对配置的内容项进行提示,须要注意的是,Eclipse 中是不支持提示的,Spring Tools 4 for Eclipse 中能够提示。

定义提示内容须要在 META-INF 中建立一个 spring-configuration-metadata.json 文件,代码以下所示。
 

{ "properties": [ { "name": "spring.user.name", "defaultValue": "cxytinadi" }, { "name": "spring.user.enabled", "type": "java.lang.Boolean", "defaultValue": false } ] }

 

name:配置名
type:配置的数据类型
defaultValue:默认值

推荐分布式架构码源