SpringBoot如何实现starter原理详解

 更新时间:2020年06月09日 14:39:44   作者:阿福聊编程  
这篇文章主要介绍了SpringBoot如何实现starter原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1、Mybatis 自定义配置的分析

在我们自定义starter之前我们写了解一下Mybatis 是如何实现starter

在SpringBoot 引入的依赖如下:

  <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.2</version>
  </dependency>

mybatis的maven 依赖,主要涉及到的内容,spring.factories、MybatisAutoConfiguration、MybatisProperties

我们来看一下 META-INF/spring.factories文件,这个文件是以Map 形式存放的。key是EnableAutoConfiguration类的全类名,

value是一个MybatisAutoConfiguration,这就是当项目启动自动配置的类。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

MybatisAutoConfiguration

@Configuration //标示是一个配置类

@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class}) //表示当SqlSessionFactory,SqlSessionFactoryBean存在这个配置类才生效。

@EnableConfigurationProperties({MybatisProperties.class}):就是把 MybatisProperties加入到 IOC 容器中。

MybatisProperties

对于@ConfigurationProperties注解它的作用就是把全局配置文件中的值绑定到实体类JavaBean上面(将配置文件中的值与MybatisProperties绑定起来),而@EnableConfigurationProperties主要是把以绑定值JavaBean加入到spring容器中。

分析完这些规则后,我们再来看看mybatis自定义的starter 的项目结构,主要是分为两个项目(一个是空项目(mtbatis-spring-boot-starter),一个是具体的实现自定义配置的项目(mybatis-spring-boot-autoconfigure)),空项目只是引入自定义配置项目的依赖,而实现映入的时候我们只需要映入空项(mtbatis-spring-boot-starter)即可。

到此我们已经分析完mybatis 自定义的starter,下面我们自己来实现一个自定义的starter。

2、自定义starter的实现

项目结构展示:

首先我们先定义一个 zfauto-spring-boot-autoconfigure 工程

编写属性类:添加 @ConfigurationProperties注解和前缀 zf.auto。之后我们就可以在 application.properties或application.yml 中 使用 zf.auto=指定参数了,由于篇幅的原因省略setter getter方法,实际是需要的,不然无法注入;

@ConfigurationProperties(prefix = "zf.auto")
public class HelloProperties {
  private String prefix;
  private String suffix;
}

编写配置类:加入@Configuration注解,@ConditionalOnWebApplication是web 应用配置类才起作用,以及 @EnableConfigurationProperties(HelloProperties.class) 注解,将属性注入到 IOC 容器中。

@Configuration
@ConditionalOnWebApplication
@EnableConfigurationProperties(HelloProperties.class)
public class HelloServiceAutoConfiguration {
  @Autowired
  HelloProperties helloProperties;
  @Bean
  public HelloService helloService(){
    HelloService helloService=new HelloService();
    helloService.setHelloProperties(helloProperties);
    return helloService;
  }

}

编写 spring.factories 文件:在resources路径下面创建META-INF,文件夹,然后创建spring.factories文件

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.zfauto.starter.HelloServiceAutoConfiguration

然后我们在创建一个空项目(zfauto-spring-boot-starter),在这个项目中我们引入zfauto-spring-boot-autoconfigure依赖

<dependency>
    <groupId>com.zfauto.starter</groupId>
    <artifactId>zfauto-spring-boot-autoconfigure</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

HelloService 实现的功能,省略setter,getter的方法(实际需要)

public class HelloService {
  HelloProperties helloProperties;
  public String sayHello(String name){
    return helloProperties.getPrefix()+ ","+name+","+helloProperties.getSuffix();
  }
}

最后我们 分别将项目打包,由于zfauto-spring-boot-starter是依赖于zfauto-spring-boot-autoconfigure,所以我们先对zfauto-spring-boot-autoconfigure进行打包,然后通过 mvn install 打到本地仓库(如何打包见下图)。

到此我们自定义的类实现。那我们来测试一下,这个和我们引入其他的starter一样了。

创建项目zfauto-spring-boot-starter-test ,引入自定义starter的依赖。

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

application.properties中的配置如下

zf.auto.prefix=hello

zf.auto.suffix=123

具体的测试类

@RestController
public class HelloController {
  @Autowired
  HelloService helloService;
  @RequestMapping("/sayHello")
  public String sayHello(){
    return helloService.sayHello("小福子");
  }
}

项目访问路径:http://localhost:8080/sayHello

好了 ,本文就说到这里,本文相关案例我已经上传到 码云 ,小伙伴们可以自行下载:https://gitee.com/xiaofuzi123/springboot-learning-example

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 深入剖析Java编程中的序列化

    深入剖析Java编程中的序列化

    这篇文章主要介绍了深入剖析Java编程中的序列化,文中谈到了序列化时对象的继承等各种问题,案例详尽,强烈推荐!需要的朋友可以参考下
    2015-07-07
  • 详解SpringBoot实现事件同步与异步监听

    详解SpringBoot实现事件同步与异步监听

    这篇文章主要通过示例为大家详细介绍了SpringBoot中的事件的用法和原理以及如何实现事件同步与异步监听,快跟随小编一起学习学习吧
    2022-06-06
  • IntelliJ Idea常用11款插件(提高开发效率)

    IntelliJ Idea常用11款插件(提高开发效率)

    这篇文章主要介绍了IntelliJ Idea常用11款插件(提高开发效率),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • java中如何使用泛型方法比较大小

    java中如何使用泛型方法比较大小

    这篇文章主要介绍了java中如何使用泛型方法比较大小,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • 关于SpringSecurity认证逻辑源码分析

    关于SpringSecurity认证逻辑源码分析

    这篇文章主要介绍了关于SpringSecurity认证逻辑源码分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java switch语句的使用详解

    Java switch语句的使用详解

    Java switch语句随JDK演进支持int/char、String及模式匹配,具备表达式限制、穿透控制、作用域隔离等特性,适用于状态机、命令解析等场景,需注意类型兼容性及break使用,推荐使用箭头语法和编译器优化提升代码质量
    2025-07-07
  • 为什么rest接口返回json建议采用下划线形式,不要用驼峰

    为什么rest接口返回json建议采用下划线形式,不要用驼峰

    为什么rest接口返回json建议采用下划线形式,不要用驼峰?今天小编就来为大家说明一下原因,还等什么?一起跟随小编过来看看吧
    2020-09-09
  • SpringBoot实现简易支付宝网页支付功能

    SpringBoot实现简易支付宝网页支付功能

    小编最近实现一个功能基于springboot程序的支付宝支付demo,非常不错适合初学者入门学习使用,今天把SpringBoot实现简易支付宝网页支付功能的示例代码分享给大家,感兴趣的朋友参考下吧
    2021-10-10
  • Java的Struts框架中配置国际化的资源存储的要点解析

    Java的Struts框架中配置国际化的资源存储的要点解析

    这篇文章主要介绍了Java的Struts框架中配置国际化的资源存储的要点解析,针对用户所使用的语言来配置资源文件,需要的朋友可以参考下
    2016-04-04
  • 浅谈Spring Data Redis读不到设进去的值

    浅谈Spring Data Redis读不到设进去的值

    本文主要介绍了Spring Data Redis怎么读不到我刚才设进去的值,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09

最新评论