1.引入springboot的自动配置相关的依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.0.0.RELEASE</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
2.定义配置参数类
@ConfigurationProperties(prefix = "spring.person")
@Data
public class PersonProperties {
// 姓名
private String name;
// 年龄
private int age;
// 性别
private String sex = "M";
}
3.核心服务类
@AllArgsConstructor
@NoArgsConstructor
public class PersonService {
private PersonProperties properties;
public void print(){
System.out.println(properties.getName()+":"properties.getAge()+":"+properties.getSex());
}
}
4.自动配置类
@Configuration
@EnableConfigurationProperties(PersonProperties.class)
@ConditionalOnClass(PersonService.class)
@ConditionalOnProperty(prefix = "spring.person", value = "enabled", matchIfMissing = true)
public class PersonServiceAutoConfiguration {
@Autowired
private PersonProperties properties;
@Bean
@ConditionalOnMissingBean(PersonService.class) // 当容器中没有指定Bean的情况下,自动配置PersonService类
public PersonService personService(){
PersonService personService = new PersonService(properties);
return personService;
}
}
5.创建spring.factories文件
路径: src/main/resources/META-INF/spring.factories 内容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.demo.PersonServiceAutoConfiguration
6.安装到maven仓库
mvn clean install
7.在其他项目中使用
引入:
<dependency>
<groupId>com.mengday</groupId>
<artifactId>helloworld-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
配置application.properties:
spring.person.name=mengday
spring.person.age=28
测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class MystarterApplicationTests {
@Autowired
private PersonService personService;
@Test
public void testprint() {
personService.print();
}
}
8.注解说明
@ConditionalOnClass:
当类路径classpath下有指定的类的情况下进行自动配置
@ConditionOnMissingBean:
当容器中中没有指定Bean的情况下进行自动配置
@ConditionOnProperty(prefix="example.service",value="enabled",matchIfMissing=true):
当配置文件中example.service.enabled=true时进行自动配置,如果没有设置此值就默认使用mathchIfMissing对应的值
@ConditionalOnMissingBean:
当容器中不存在该bean时
9.starter工作原理
1.SpringBoot在启动时扫描项目所依赖的jar包,寻找spring.factories文件的jar包
2.读取spring.factories文件获取配置的自动配置类AutoCOnfiguration
3.然后将自动配置下满足条件的bean放入到spring容器中
4.这样使用者就可以直接用来注入,因为该类已经在容器中了