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());
}

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

个人博客地址


wotrd
240 声望36 粉丝

有术无道,止于术;有道无术,有术可求。