SpringBoot 最强大的功能就是把我们常用的场景抽取成了一个个starter(场景启动器),我们通过引入springboot 为我提供的这些场景启动器,我们再进行少量的配置就能使用相应的功能。即使是这样,springboot也不能囊括我们所有的使用场景,往往我们需要自定义starter,来简化我们对springboot的使用。
如何编写自动配置 ?
我们参照@WebMvcAutoConfiguration为例,我们看看们需要准备哪些东西,下面是WebMvcAutoConfiguration的部分代码:
@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
@Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})
@EnableConfigurationProperties({WebMvcProperties.class, ResourceProperties.class})
public static class WebMvcAutoConfigurationAdapter extends WebMvcConfigurerAdapter {
@Bean
@ConditionalOnBean({View.class})
@ConditionalOnMissingBean
public BeanNameViewResolver beanNameViewResolver() {
BeanNameViewResolver resolver = new BeanNameViewResolver();
resolver.setOrder(2147483637);
return resolver;
}
}
}
我们可以抽取到我们自定义starter时同样需要的一些配置。
@Configuration //指定这个类是一个配置类
@ConditionalOnXXX //指定条件成立的情况下自动配置类生效
@AutoConfigureOrder //指定自动配置类的顺序
@Bean //向容器中添加组件
@ConfigurationProperties //结合相关xxxProperties来绑定相关的配置
@EnableConfigurationProperties //让xxxProperties生效加入到容器中
自动配置类要能加载需要将自动配置类,配置在META-INF/spring.factories中 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
我们参照 mybatis-spring-boot-starter 我们发现其中没有代码:
我们在看它的pom中的依赖中有个 mybatis-spring-boot-autoconfigure
关于mybatis的一些自动配置都写在了这里 ,所以我们有总结:
命名规范
官方命名空间
自定义命名空间
我们需要先创建一个父maven项目:springboot_custome_starter
两个Module: fztx-spring-boot-starter 和 fztx-spring-boot-starter-autoconfigurer
springboot_custome_starter
pom.xml
4.0.0
fztx-spring-boot-starter-autoconfigurer
fztx-spring-boot-starter
org.springframework.boot
spring-boot-starter-parent
2.5.4
pom
com.springboot
springboot_custome_starter
0.0.1-SNAPSHOT
springboot_custome_starter
SpringBoot自定义starter
1.8
org.springframework.boot
spring-boot-starter
1. fztx-spring-boot-starter
1.pom.xml
springboot_custome_starter
com.springboot
0.0.1-SNAPSHOT
4.0.0
fztx-spring-boot-starter
启动器(starter)是一个空的jar文件,
仅仅提供辅助性依赖管理,
这些依赖需要自动装配或其他类库。
8
8
com.springboot
fztx-spring-boot-starter-autoconfigurer
如果使用spring Initializr创建的需要删除 启动类、resources下的文件,test文件。
2. fztx-spring-boot-starter-autoconfigurer
1. pom.xml
springboot_custome_starter
com.springboot
0.0.1-SNAPSHOT
4.0.0
fztx-spring-boot-starter-autoconfigurer
8
8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-configuration-processor
true
2. FztxProperties
@ConfigurationProperties("fztx.hello")
public class FztxProperties {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3. IndexController
@RestController
public class IndexController {
private FztxProperties fztxProperties;
public IndexController(FztxProperties fztxProperties) {
this.fztxProperties = fztxProperties;
}
@RequestMapping("/")
public String index(){
return fztxProperties.getName()+"欢迎您";
}
}
4. FztxAutoConfitguration
/**
* 给web应用自动添加一个首页
*/
@Configuration
@ConditionalOnProperty(value = "fztx.hello.name")
@EnableConfigurationProperties(FztxProperties.class)
public class FztxAutoConfitguration {
@Autowired
FztxProperties fztxProperties;
@Bean
IndexController indexController(FztxProperties fztxProperties){
return new IndexController(fztxProperties);
}
}
5. spring.factories
在 resources 下创建文件夹 META-INF 并在 META-INF 下创建文件 spring.factories ,内容如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.fztx.FztxAutoConfitguration
到这儿,我们的配置自定义的starter就写完了 ,我们fztx-spring-boot-starter-autoconfigurer、fztx-spring-boot-starter 安装成本地jar包。
我们创建个Module: springboot_starter,来测试系我们写的stater。
1. pom.xml
com.springboot
fztx-spring-boot-starter
0.0.1-SNAPSHOT
2.浏览
http://localhost:8080/
由于在自动配置上设置了
@ConditionalOnProperty(value = "fztx.hello.name")
但我们还没有配置。so......
3. application.properties
fztx.hello.name="CSDN"
再次访问:http://localhost:8080/