一.spring boot实现自定义配置的三种方式
- 最简单的方法就是通过@Configuration配置相关类,并且用@ComponentScan注解设置包含配置类的路径,spring boot启动时会将配置类装载进容器统一管理,从而实现自定义配置的加载
- 通过@Import注解直接导入相关配置类,可导入的类型有:使用了@Configuration注解的类,ImportSelector的子类,ImportBeanDefinitionRegistrar的子类。
- 用提供给第三方调用的starter形式,实现自定义配置的加载,让所有引入此module的应用都能实现配置加载,并且使用方可自定义相关配置参数,例如spring-boot-starter-web
二.自定义的spring boot starter的意义
- 通过把通用配置和底层处理代码包装成starter,让所有的业务模块通过引用该starter模块,可以实现业务代码解耦,集中控制与业务无关的通用处理
- starter具有可插拔的特性,即插即用,对业务代码零入侵,使用方可自定义相关配置来获取不同特性
三.怎样实现spring boot starter
- 准备一个Propertites文件,用于读取使用方配置的参数,用到的注解有@ConfigurationProperties(prefix=“xxx”)等
- 准备一个Configuration文件,用于通过Propertites文件获取相应参数,在Configuration中可以新建一些bean,新建的bean就是我们的业务处理类,交给spring容器管理
- 在resources文件夹下新建META-INF文件夹,在META-INF下新建spring.factories文件,在文件中配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.study.CustomerConfiguration
,也即是设置需要自动配置的目标类,可以设置多个目标类
Propertites文件
package com.study;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix="person")
@Data
public class CustomerPropertites {
private String id;
private String name;
private String gender;
private String address;
}
Configuration文件
@Configuration
@EnableConfigurationProperties(CustomerPropertites.class)
@ConditionalOnProperty(prefix="person", name="enabled", havingValue = "true")
@Data
public class CustomerConfiguration {
@Autowired
private CustomerPropertites customerPropertites;
@Bean
@ConditionalOnClass(CustomerService.class)
@ConditionalOnMissingBean(CustomerService.class)
public CustomerService customerService(){
return CustomerService.builder()
.id(customerPropertites.getId())
.name(customerPropertites.getName())
.gender(customerPropertites.getGender())
.address(customerPropertites.getAddress())
.build();
}
}
Configuration文件中新建的bean,业务处理类
package com.study;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class CustomerService {
private String id;
private String name;
private String gender;
private String address;
public String getInfo(){
return id + "-" + name + "-" + gender + "-" + address;
}
}
四.其他project引用starter
<dependency>
<groupId>com.study</groupId>
<artifactId>personal-code-learning-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
package com.personal.code.springboot;
import com.study.CustomerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class CustomerController {
@Autowired
private CustomerService customerService;
@RequestMapping("/getInfo")
@ResponseBody
public String getInfo(){
return customerService.getInfo();
}
}
自定义spring boot starter demo:https://github.com/BoyQiang/personal-code-learning