手写SpringBoot-starter组件

一:手写starter组件步骤:

SpringBoot有个很好的特性,即开箱即用,只要引入对应的starter组件,使用@Autowired注解即可实例化Bean,那原理是怎么的呢?先通过手写一个简单的数据库连接的组件了解步骤,再通过代码看原理。
总体步骤:
1.创建配置类
2.创建Bean
3.创建自动装配类,导入配置类
4.spring.factories配置自动装配类
具体步骤
1 . 创建XXXProperties 在此类上添加@ConfigurationProperties注解
说明:@ConfigurationProperties是springboot提供读取配置文件的一个注解。其对应的bean的后置处理器为ConfigurationPropertiesBindingPostProcessor,支持属性文件和javaBean的映射,它是实现了BeanPostProcessor接口,在bean被实例化后,会调用后置处理,递归的查找属性,通过反射注入值,对大多数属性而言强制需提供其setter和getter方法
设置配置文件中可以设置的属性,prefix设置前缀

@ConfigurationProperties(prefix="xiaohou.datasource")
public class DataSourceProperties {
    private String driver;
    private String userName;
    private String passWord;
    private String url;
 ...
 //getter and setter   

2.创建数据库连接的Bean,并提供基本属性和方法
数据库连接需要有数据库驱动,用户名,密码,url

public class DataSourceConnection {
    private String driver;
    private String userName;
    private String passWord;
    private String url;
    private Connection connection=null;

    public DataSourceConnection(String driver, String userName, String passWord, String url) {
        this.driver = driver;
        this.userName = userName;
        this.passWord = passWord;
        this.url = url;

        try {
            //1.注册数据库驱动
             Class.forName(driver);
             //2.获得连接
            connection =DriverManager.getConnection(url,userName,passWord);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 获得数据库连接
     */
    public Connection getConnection() {
        return connection;
    }
    /**
     * 关闭数据库连接
     */
    public void closeConnection(){
        try {
            if(connection!=null) {
                connection.close();
            }
        } catch (SQLException e) {
            System.out.println("连接关闭异常!");
            System.exit(0);
        }
    }
}

3.创建自动装配类:XXXAutoConfiguration,添加@Configuration、@EnableConfigurationProperties注解,导入对应的配置类
在这里将DataSourceConnection加载到spring容器中,只有先加载到容器中才能通过@Autowired进行实例化。

@Configuration
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
    private final DataSourceProperties dataSourceProperties;

    public DataSourceAutoConfiguration(DataSourceProperties dataSourceProperties) {
        this.dataSourceProperties = dataSourceProperties;
    }
    //将DataSourceConnection加载到IOC容器中
    @Bean
    public DataSourceConnection dataSourceConnection(DataSourceProperties dataSourceProperties){
        DataSourceConnection dataSourceConnection = new DataSourceConnection(dataSourceProperties.getDriver(),dataSourceProperties.getUserName(),
                dataSourceProperties.getPassWord(),dataSourceProperties.getUrl());
        return dataSourceConnection;
    }
}

4.META-INF/spring.factories中配置上自动装配类

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.xiaohou.spring.boot.starter.jdbc.DataSourceAutoConfiguration

以上是创建starter的组件。如果希望application.properties在配置数据库连接时有提示可以在
META-INF/additional-spring-configuration-metadata.json中配置属性

{
  "properties": [
    {
    "name": "xiaohou.datasource.driver",
    "type": "java.lang.String",
    "description": "数据库驱动",
    "defaultValue": "com.mysql.jdbc.Driver"
  },
    {
      "name": "xiaohou.datasource.userName",
      "type": "java.lang.String",
      "description": "数据库用户名"
    },
    {
      "name": "xiaohou.datasource.passWord",
      "type": "java.lang.String",
      "description": "数据库密码"
    },
    {
      "name": "xiaohou.datasource.url",
      "type": "java.lang.String",
      "description": "数据库URL"
    }
    ]
  }

二 验证组件

1.创建SpringBoot项目并引入刚刚写好的starter组件
pom.xml文件中引入写好的组件,因为是mysql的连接,还需要导入mysql的驱动。
手写SpringBoot-starter组件_第1张图片
2.application.properties或yml中配置相关属性

xiaohou.mybatis.config-location=88888
xiaohou.datasource.driver=com.mysql.jdbc.Driver
xiaohou.datasource.userName=root
xiaohou.datasource.passWord=123QWEasd
xiaohou.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC

3.创建HelloController,通过@Autowired将DataSourceConnection实例化,调用getConnection获得数据库连接
手写SpringBoot-starter组件_第2张图片
验证是否可以访问成功
手写SpringBoot-starter组件_第3张图片

你可能感兴趣的:(SpringBoot,spring)