SpringBootStarter 分析及其手写实现

SpringBootStarter 分析及其实现

stater可以帮助我们省略很多的配置,我们不如分析下,SpringBoot的stater,然后实现一版自己的starter:主要是类似Mybatis那种自动根据条件注入的功能

mybatis-spring-boot-starter

Mybatis-starter主要包含两个pom文件点进去可以看到:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot</artifactId>
    <version>1.1.1</version>
  </parent>
  <artifactId>mybatis-spring-boot-starter</artifactId>		
  <name>mybatis-spring-boot-starter</name>
  <dependencies>
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-autoconfigure</artifactId>
      <version>1.1.1</version>
    </dependency>
  </dependencies>
</project>

打开mybatis-spring-boot-autoconfigure的jar包可以看到:

在这里插入图片描述

其中SpringFactories配置文件的内容是使用@ConfigureRation 注解会扫描的注解类,打开注解类可以看到
在这里插入图片描述

@Configuration 					//表明这是注解类
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })	//只有存在括号里面的类才会加载
@ConditionalOnBean(DataSource.class)		//只有注入了这个bean才会加载
@EnableConfigurationProperties(MybatisProperties.class)		//
@AutoConfigureAfter(DataSourceAutoConfiguration.class)		//注入先后顺序

@EnableConfigurationProperties

关于这个注解我们不得不先说下@ConfigurationProperties

有时候有这样子的情景,我们想把配置文件的信息,读取并自动封装成实体类,这样子,我们在代码里面使用就轻松方便多了,这时候,我们就可以使用@ConfigurationProperties,它可以把同类的配置信息自动封装成实体类

首先在配置文件里面,这些信息是这样子滴

connection.username=admin
connection.password=kyjufskifas2jsfs
connection.remoteAddress=192.168.1.1

这时候我们可以定义一个实体类在装载配置文件信息

@Component
@ConfigurationProperties(prefix="connection")
public class ConnectionSettings {

    private String username;
    private String remoteAddress;
    private String password ;

    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getRemoteAddress() {
        return remoteAddress;
    }
    public void setRemoteAddress(String remoteAddress) {
        this.remoteAddress = remoteAddress;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

}

在spring-boot中,

1、如果@ConfigurationProperties所注的类可以被springboot扫描并添加进容器中作为bean(比如使用@Component等注解,或者配置扫描该类所在包等手段),那么spring容器会自动使该类上的@ConfigurationProperties生效,创建一个该类的实例,然后把对应配置属性绑定进该实例,再把该实例作为bean添加进spring容器。

2、如果该类只使用了@ConfigurationProperties注解,然后该类没有在扫描路径下或者没有使用@Component等注解,导致无法被扫描为bean,那么就必须在配置类上使用@EnableConfigurationProperties注解去指定这个类,这个时候就会让该类上的@ConfigurationProperties生效,然后作为bean添加进spring容器中

Spring框架还提供了很多@Condition给我们用

@ConditionalOnBean(仅仅在当前上下文中存在某个对象时,才会实例化一个Bean@ConditionalOnClass(某个class位于类路径上,才会实例化一个Bean@ConditionalOnExpression(当表达式为true的时候,才会实例化一个Bean@ConditionalOnMissingBean(仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean)该注解表示,如果存在它修饰的类的bean,则不需要再创建这个bean;可以给该注解传入参数例如@ConditionOnMissingBean(name = "example"),这个表示如果name为“example”的bean存在,这该注解修饰的代码块不执行。

@ConditionalOnMissingClass(某个class类路径上不存在的时候,才会实例化一个Bean@ConditionalOnNotWebApplication(不是web应用)

@ConditionalOnProperty(当有配置信息时生效)
    
@EnableConfigurationProperties	注解在类上,声明开启属性注入,使用@Autowired注入。

@AutoConfigureAfter	在指定的自动配置类之后再配置。

@ImportResource	虽然Spring提倡零配置,但是还是提供了对xml文件的支持,这个注解就是用来加载xml配置的。

当然Mybatis也是通过这些注解完成判断你是不是自定义了自己的实现。

实现

代码:https://gitee.com/xinshuai/Sprring-Starter
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值