springboot作为java开发者不得不提的一个框架,其中也是有许多配置可以减轻开发者的工作量。
简化了Bean对象注入到IoC容器中的流程(自动装配),配置文件的统一管理。
比如自动装配,引入一个starter就可以实现了,大大减少了代码量,使得coder专注于业务代码。
自动装配原理
首先你需要去熟悉SPI机制
具体的逻辑就不展示了,这里只展现关键代码。如果需要详细启动逻辑代码的同学评论走一波,需求多的话就更新。
springboot自动装配的流程
就是随着A项目的启动,会扫描到@SpringBootApplication
注解
该注解里面存在一个@EnableAutoConfiguration
注解
在EnableAutoConfiguration
注解里面又存在一个Import注解
执行selectImports
方法,selectImports
返回的是配置类的全路径名
配置类从何而来,是基于SPI机制,去classpath下的META-INF
目录下找所有的spring.factories
文件,然后将所有的spring.factories
文件进行解析
自动将我所需要的Bean对象注入到IoC容器里面去,@Configuration
和@Bean
,自动体现在我没有对任何类加前面的两个注解
手写一个starter
1.我们先新建一个springboot项目,这里的application.properties
和Application
启动类都是不需要的

2.定义一个简单的Boy类
/**
* @author suncong
*/
public class Boy{
public static Boy create(String name){
return new Boy(name);
}
private String name;
public Boy(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String say(){
return name+",Hello World!";
}
}
3.定义自动配置类
/**
* @author suncong
*/
@ConditionalOnClass(Boy.class) // 加载到Boy这个类的话,就自动装配
@EnableConfigurationProperties(BoyProperties.class)
@Configuration
@Data
@ComponentScan
public class BoyAutoConfiguration {
/**
* 将对象交给IOC管理
* @param boyProperties
* @return
*/
@Bean
Boy boy(BoyProperties boyProperties){
return new Boy(boyProperties.getName());
}
}
4.定义ConfigurationProperties
类,从配置文件(引用这个starter的项目的配置文件)中读取配置
/**
* @author suncong
*/
@ConfigurationProperties(prefix = "demo.boy")
public class BoyProperties {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
5.META-INF文件
“
注意这里的每个包名都要正确!!
比如META_INF
和spring.factories
就是错的(别问我怎么知道的…)
additional-spring-configuration-metadata.json
这个文件可写可不写,主要是定义配置信息的内容(指定demo.boy.name
必须是String类型)
{
"properties": [
{
"name": "demo.boy.name",
"type":"java.lang.String",
"description": "想跳舞的人",
"defaultValue": "sc"
}
]
}
spring.factories 这个文件必须写,配置自动装配的类的路径
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
com.sc.demo.BoyAutoConfiguration
6.打包

这样的话,本地的maven仓库就有了这个jar包(后续可以上传仓库或者直接发jar给别人用)
7.再新建一个springboot项目
定义启动类和配置类
/**
* @author SunCong
*/
@RestController
@SpringBootApplication
public class Demo1Application {
public static void main(String[] args) {
SpringApplication.run(Demo1Application.class, args);
}
@Autowired
private com.sc.demo.Boy boy;
@GetMapping("/say")
public String say(){
return boy.say();
}
}
application.properties:
# 应用名称
spring.application.name=demo1
server.port=8081
demo.boy.name="scscsc"
pom.xml:
<dependency>
<groupId>com.sc</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

8.测试

我们也可以修改配置文件
# 应用名称
spring.application.name=demo1
server.port=8081
demo.boy.name="shuaige"

搞定!!!
两类starter的区别
我们注意到有这么两个starter:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
一个是xxx-starter
,一个是stater-xxx
区别:
-
starter
命名规则不一样(如上) -
xxx-starter
是第三方的,自动配置类在

starter-xxx
是官方的,自动配置类在

最后,感谢您的观看!欢迎点赞 关注,评论出本文的不足之处
来源:juejin.cn/post/7195890214211534903
后端专属技术群
构建高质量的技术交流社群,欢迎从事编程开发、技术招聘HR进群,也欢迎大家分享自己公司的内推信息,相互帮助,一起进步!
文明发言,以
交流技术
、职位内推
、行业探讨
为主
广告人士勿入,切勿轻信私聊,防止被骗

加我好友,拉你进群
原文始发于微信公众号(Java知音):SpringBoot自动装配原理+手写一个starter组件
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/295670.html