对于springboot个人认为它就是整合了各种组件,然后提供对应的自动装配和启动器(starter),基于这个流程去实现一个定义的装配组件
还是这张图
一、创建自己的自动配置工程, spring.factories文件中配置上自己的配置
1.创建一个Properties类(UserDefProperties)用于接收配置文件配置的参数,类似于RabbitMQ/Mybatis等在yaml中配置的参数(对标该类org.springframework.boot.autoconfigure.amqp.RabbitProperties),
package com.nijunyang.autoconfig.properties; import org.springframework.boot.context.properties.ConfigurationProperties; /** * * 自定义的配置类,映射配置文件参数 * @author: create by nijunyang * @date:2019/7/15 */ @ConfigurationProperties(prefix = "spring.userdef.model") public class UserDefProperties { private String userName; private Integer age; private Double height; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Double getHeight() { return height; } public void setHeight(Double height) { this.height = height; } }
2.创建一个XXXAutoConfiguration类(UserDefAutoConfiguration),实现我们的装配逻辑也就是从配置文件中获取数据并初始化我们需要的数据,比如RabbitMQ/Mybatis初始化各种连接工厂(org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration.RabbitConnectionFactoryCreator#rabbitConnectionFactory),我们这儿就获取配置数据转换成一个对象用于测试效果,
package com.nijunyang.autoconfig.config; import com.nijunyang.autoconfig.model.User; import com.nijunyang.autoconfig.properties.UserDefProperties; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; /** * 自定义启动类配置类 * @author: create by nijunyang * @date:2019/7/15 */ @Slf4j @EnableConfigurationProperties(value = UserDefProperties.class) public class UserDefAutoConfiguration { @Autowired private UserDefProperties userDefProperties; @Bean public User user(){ log.info("自定义自动装配UserDefAutoConfiguration....."); User user = new User(); user.setAge(userDefProperties.getAge()); user.setUserName(userDefProperties.getUserName()); user.setHeight(userDefProperties.getHeight()); return user; } }
3. spring.factories文件中配置EnableAutoConfiguration数据指向我们自己的UserDefAutoConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.nijunyang.autoconfig.config.UserDefAutoConfiguration
二、创建自己的启动器(starter)
1.启动器啥都不需要做,只需要引入自动配置工程依赖
<dependency> <groupId>com.nijunyang</groupId> <artifactId>autoconfig</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
三、测试工程
1. 引入启动器依赖
<dependency> <groupId>com.nijunyang</groupId> <artifactId>starter</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
2. application.properties配置中加入自动配置工程中Properties类对应的值,类似我们在application.properties配置mybatis连接一样
spring.userdef.model.userName=zhangsan spring.userdef.model.age=18 spring.userdef.model.height=1.70
3.测试接口类,自动注入我们用我们用于测试的建模
package com.nijunyang.autoconfigurationstartertest.controller; import com.nijunyang.autoconfig.model.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * @author: create by nijunyang * @date:2019/7/15 */ @RestController public class Controller { @Autowired User user; @GetMapping("/test") public User getUser() { return user; } // @GetMapping("/test") // public String getUser() // { // return "123"; // } }
4.启动工程查看日志,发现我们自定义的装配类日志会在启动日志输出,说明启动过程中去自动装配了自己的组件
5.测试接口访问,返回配置文件中的数据
四、断点查看selectImports方法引入自定义启动和不引入对比,org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#selectImports
引入:
不引入:
至此就简单实现了一个自定义的自动装备组件...
原文地址:https://www.cnblogs.com/nijunyang/p/11191971.html