1、什么是 Spring Boot Stater ?
创建一个AutoConfiguration,并且把这个类加入 resources 文件夹下新建目录 META-INF下的spring.factories配置文件中进行声明 ,springboot启动的时候会读取所有的spring.factories中的类并且初始化bean。
2、源码处理类
org.springframework.core.io.support.SpringFactoriesLoader
核心方法是loadSpringFactories加载类,代码如下:
private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
MultiValueMap<String, String> result = (MultiValueMap)cache.get(classLoader);
if (result != null) {
return result;
} else {
try {
Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
LinkedMultiValueMap result = new LinkedMultiValueMap();
while(urls.hasMoreElements()) {
URL url = (URL)urls.nextElement();
UrlResource resource = new UrlResource(url);
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
Iterator var6 = properties.entrySet().iterator();
while(var6.hasNext()) {
Entry<?, ?> entry = (Entry)var6.next();
List<String> factoryClassNames = Arrays.asList(StringUtils.commaDelimitedListToStringArray((String)entry.getValue()));
result.addAll((String)entry.getKey(), factoryClassNames);
}
}
cache.put(classLoader, result);
return result;
} catch (IOException var9) {
throw new IllegalArgumentException("Unable to load factories from location [META-INF/spring.factories]", var9);
}
}
}
可以直接使用这个类的方法,SpringFactoriesLoader.loadFactories(BeanInfoFactory.class, CachedIntrospectionResults.class.getClassLoader());
3、例子
- 1、新增一个项目,如maven项目,pom.xml文件如下
<groupId>com.yym</groupId>
<artifactId>my-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
- 2、新增一个bean
package com.yym.frame.spring.lifecycle;
import org.springframework.context.annotation.Configuration;
/**
* @author yinyuming
* Created by yinyuming on 2020/6/19 16:00
*/
@Configuration
public class MyAutoConfiguration{
public MyAutoConfiguration() {
System.out.println("我的bean被初始化啦");
}
}
- 3、新增一个spring.factories文件,放在项目下resources的META-INF,
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.yym.frame.spring.lifecycle.MyAutoConfiguration
- 4、在你想要的springboot项目直接增加依赖就能自动初始化MyAutoConfiguration这个bean啦
<dependency>
<groupId>com.yym</groupId>
<artifactId>my-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>