本文主要对自动配置进行一个简单的模拟,目的是为了明白自动配置的过程大概是怎么回事。以及我们自己动手写了一个小例子测试一下。
自动装配:目的就是不通过开发者 利用 @ComponentScan @EnableXXX 去加载需要的模块组件。
SpringBoot 通过 @EnableAutoConfiguration 去加载各自项目下的 META-INF/spring.factories。所有项目的:META-INF/spring.factories 在 jar 包,pom.xml 必须有相应的 jar 包导入, META-INF/spring.factories 才能被读取
@EnableAutoConfiguration 会主动读取 META-INF/spring.factories三个地方:
1、本项目的 META-INF
2、 POM.xml导入的 jar 包中的 META-INF
3、 springboot 全局 spring-boot-autoconfigure
@EnableXXX小结
@Import(类对象)
1、类对象就是模块组件类对象(@Configuration @Bean)
2 、导入接口(ImportSelector) 实现类,实现类返回模块组件对象的名称的数组
一、先写个@Configuration
@Configuration
public class PersonConfiguration {
@Bean
public worker getWorker() {
return new worker();
}
@Bean
public banker getBanker() {
return new banker();
}
}
二、写个自定义@EnableXXX
把刚才的@Configuration通过@Import导进来
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(PersonConfiguration.class)
public @interface EnablePerson {
}
三、再定义一个类来用这个注解
@Configuration
@EnablePerson
@ConditionalOnProperty( name = "person",havingValue = "true")
//@ConditionalOnClass(com.wgc.entity.live.class)
@ConditionalOnBean( name = "say" )
public class EnableAutoPerson {
}
四、自定义META-INF下的spring.factories
这是我们要告诉SpringBoot自动配置也要把我们写的组件加进来
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.wgc.config.EnableAutoBConfiguration,\
com.wgc.config.EnableAutoPerson
五、测试一下
这样我们不用扫描就能通过@EnableAutoConfiguration把我们本地的资源加载进容器使用了
@SpringBootConfiguration
@EnableAutoConfiguration
public class TestRun {
@Bean
public String say() {
return "dddd say";
}
public static void main(String[] args) {
ConfigurableApplicationContext context = new SpringApplicationBuilder(TestRun.class)
.web(WebApplicationType.NONE)
.run(args);
String book = context.getBean("mysql",String.class);
System.out.println("book bean : =="+book);
banker banker = context.getBean("getBanker",banker.class);
System.out.println("banker bean : =="+banker.say());
}
}