手写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的驱动。
在这里插入图片描述
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获得数据库连接
在这里插入图片描述
验证是否可以访问成功
在这里插入图片描述

当然可以!以下是一个简单的示例,展示了如何手写一个Spring Boot Starter: 首先,创建一个 Maven 项目,并添加以下依赖项: ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.5.4</version> </dependency> </dependencies> ``` 接下来,创建一个自定义的自动配置类,用于配置你的 Starter: ```java @Configuration @EnableConfigurationProperties(MyStarterProperties.class) public class MyStarterAutoConfiguration { private final MyStarterProperties properties; public MyStarterAutoConfiguration(MyStarterProperties properties) { this.properties = properties; } // 在此处定义你的自动配置逻辑 @Bean public MyStarterService myStarterService() { return new MyStarterService(properties); } } ``` 然后,创建一个属性类,用于将外部配置绑定到属性上: ```java @ConfigurationProperties("my.starter") public class MyStarterProperties { private String message; // 提供 getter 和 setter } ``` 最后,创建一个自定义的服务类,该服务类将在你的 Starter 中使用: ```java public class MyStarterService { private final MyStarterProperties properties; public MyStarterService(MyStarterProperties properties) { this.properties = properties; } public void showMessage() { System.out.println(properties.getMessage()); } } ``` 现在,你的 Spring Boot Starter 已经准备就绪了!你可以将其打包并使用在其他 Spring Boot 项目中。在其他项目的 `pom.xml` 文件中,添加你的 Starter 依赖: ```xml <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>my-starter</artifactId> <version>1.0.0</version> </dependency> </dependencies> ``` 然后,在你的应用程序中使用 `MyStarterService`: ```java @SpringBootApplication public class MyApplication implements CommandLineRunner { private final MyStarterService myStarterService; public MyApplication(MyStarterService myStarterService) { this.myStarterService = myStarterService; } public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } @Override public void run(String... args) throws Exception { myStarterService.showMessage(); } } ``` 这样,你就成功地创建了一个简单的 Spring Boot Starter!当其他项目引入你的 Starter 并运行时,将会输出预定义的消息。 当然,这只是一个简单的示例,真实的 Starter 可能包含更多的配置和功能。你可以根据自己的需求进行扩展和定制。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值