自定义springboot的starter

123 阅读1分钟

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.这样使用者就可以直接用来注入,因为该类已经在容器中了