springboot系列之自定义starter

springboot系列之自定义starter

Scroll Down

springboot系列之自定义starter

1、创建starter项目

1)创建一个Springboot项目demo
2)在pom文件中添加依赖

\<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processor</artifactId>
	<optional>true</optional>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>

3)创建配置类

@ConfigurationProperties(prefix = "http") // 自动获取配置文件中前缀为http的属性,把值传入对象参数
@Setter
@Getter
public class HttpProperties {

	// 如果配置文件中配置了http.url属性,则该默认属性会被覆盖
	private String url = "http://www.baidu.com/";

}

4)穿件Autoconfig文件

@Configuration
@EnableConfigurationProperties(HttpProperties.class)
public class HttpAutoConfiguration {

    @Resource
    private HttpProperties properties; // 使用配置

    // 在Spring上下文中创建一个对象
    @Bean
    @ConditionalOnMissingBean
    public HttpClient init() {
    	HttpClient client = new HttpClient();

        String url = properties.getUrl();
    	client.setUrl(url);
    	return client;
    }
}

5)创建spring.factories文件
添加配置

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.nosuchfield.httpstarter.HttpAutoConfiguration

6)打包在别的项目依赖就可以使用了

2、Springboot如何加载装配的

我们在网上找的教程基本都是这样的,上面也是我复制别人的。
我们需要知道Springboot如何进行自动装配的。
在spring.factories文件中配置的类,Springboot启动会进行扫描,spi机制。

我们查看HttpAutoConfiguration类,找到EnableConfigurationProperties注解,点开这个注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

	String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

	/**
	 * Exclude specific auto-configuration classes such that they will never be applied.
	 * @return the classes to exclude
	 */
	Class<?>[] exclude() default {};

	/**
	 * Exclude specific auto-configuration class names such that they will never be
	 * applied.
	 * @return the class names to exclude
	 * @since 1.3.0
	 */
	String[] excludeName() default {};
}

重点在@Import注解,springboot会自动配置@Import注解下的接口,AutoConfigurationImportSelector实现了DeferredImportSelector接口。
这是ImportSelector接口的拓展类,有延迟配置作用。他把所有的bean都初始化完成之后,才进行初始化。

public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware,
	ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {

还实现了BeanFactoryAware,类加载器。
这个可以用代码进行注入。
bean工厂使用名字注册

factory.registerSingleton(properties.getServiceName(), counterService);

这里看一下importselect的的方法:

@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
	if (!isEnabled(annotationMetadata)) {
		return NO_IMPORTS;
	}
	AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
			.loadMetadata(this.beanClassLoader);
	AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata,
			annotationMetadata);
	return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}

这个方法把返回的数组进行注入

个人博客地址