• SpringBoot中starter的实现,so easy!


    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容器中。

    那么META-INF/spring.factories 在什么时候加载呢?,具体参考:这样讲SpringBoot自动配置原理原理,简单易懂

    分析完这些规则后,我们再来看看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.propertiesapplication.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各种技术文章。

  • 相关阅读:
    要么优秀,要么负责阅读作业二感想
    Python核心编程学习日记之数字,序列
    Python核心编程学习日记之错误处理
    Python核心编程学习日记之语法和对象
    Innobakcupex 代码解析
    通过initconnect + binlog 实现MySQL审计功能
    关于Relay Log无法自动删除的问题
    MySQL中 timeout相关参数解析
    慢查询日志中出现超大时间的案例分析
    主键乱序插入对Innodb性能的影响
  • 原文地址:https://www.cnblogs.com/xiaofuzi123456/p/13055593.html
Copyright © 2020-2023  润新知