Open xiwenAndlejian opened 5 years ago
public class AutoConfigTest {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(DemoAutoConfiguration.class));
@Test
public void testDefaultConfig() {
this.contextRunner.withUserConfiguration(DemoProperties.class)
.run((context) -> {
// 容器中只存在一个 DemoService 类对应的 bean
assertThat(context).hasSingleBean(DemoService.class);
// isSameAs 与 == 等价,表示同一个对象
assertThat(context.getBean(DemoProperties.class)).isSameAs(
context.getBean(DemoService.class).getProperties());
DemoProperties properties = context.getBean(DemoProperties.class);
assertEquals(DemoProperties.DEFAULT_HOST, properties.getHost());
assertEquals(DemoProperties.DEFAULT_PORT, properties.getPort());
});
}
@Test
public void testCustomizeEnvironment() {
this.contextRunner
.withPropertyValues("demo.host=customize")
.withPropertyValues("demo.port=9000")
.run((context) -> {
assertThat(context).hasSingleBean(DemoService.class);
assertThat(context.getBean(DemoProperties.class).getPort()).isEqualTo(9000);
assertThat(context.getBean(DemoProperties.class).getHost()).isEqualTo("customize");
});
}
@Test
public void testIfNotPresent() {
// 当 DemoService 未被使用时,自动配置应当被禁用
this.contextRunner.withClassLoader(new FilteredClassLoader(DemoService.class))
.run((context) -> assertThat(context).doesNotHaveBean("demoService"));
}
}
@Autowired
private DemoService demoService;
public void callDoSomething() {
System.out.println(demoService.doSomething());
}
注意,使用前应当把spring-boot-starter-demo
的依赖加入当前工程pom
文件中。
<dependency>
<groupId>com.dekuofa</groupId>
<artifactId>spring-boot-starter-demo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
参考内容:
编写一个 Spring Boot Starter
源码
假设目前我们有一个公共服务,这个服务被多个工程所使用,并且需要一定基础配置项才能启用。为了简化使用方的流程,我们将这个服务单独独立出来,为它制作一个
spring-boot-starter
。构建 maven 工程
pom文件:
迁移(创建)Service
⚠️:这里没有使用
@Service
注解,因此没有提供无参构造函数。若使用@Service
,则需要提供无参的构造函数。配置类:DemoProperties
@Primary
:当存在多个可能类时,优先加载有此注解的类@ConfigurationProperties
:读取配置项并绑定在类对应属性上。其中prefix
表示属性名前缀,因此对应配置文件的属性为:demo.host
和demo.port
自动配置类
@ConditionalOnClass
:当指定类在类路径上时才匹配。@ConditionalOnMissingBean
:只有在BeanFactory
中尚未包含指定的类或名称时才匹配。@EnableConfigurationProperties
:启动对带有@ConfigurationProerties
注解的bean
支持。spring.factories
最后我们需要在路径:
src/main/resouces
下创建文件夹META-INF
,并在其中创建文件spring.factories
,
:分割多个自动配置类\
:换行这样一个
Spring Boot Starter
就制作完成了。接下来我们对它进行测试,校验自动配置是否生效。