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)打包在别的项目依赖就可以使用了
我们在网上找的教程基本都是这样的,上面也是我复制别人的。
我们需要知道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()); }
这个方法把返回的数组进行注入
个人博客地址