SpringBoot 最强大的功能就是把我们常用的场景抽取成了一个个starter(场景启动器),我们通过引入springboot 为我提供的这些场景启动器,我们再进行少量的配置就能使用相应的功能。即使是这样,springboot也不能囊括我们所有的使用场景,往往我们需要自定义starter,来简化我们对springboot的使用。
二、如何自定义starter 1.实例如何编写自动配置 ?
我们参照@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时同样需要的一些配置。
2.模式@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的一些自动配置都写在了这里 ,所以我们有总结:
- 启动器(starter)是一个空的jar文件,仅仅提供辅助性依赖管理,这些依赖可能用于自动装配或其他类库。
- 需要专门写一个类似spring-boot-autoconfigure的配置模块
- 用的时候只需要引入启动器starter,就可以使用自动配置了
命名规范
官方命名空间
- 前缀:spring-boot-starter-
- 模式:spring-boot-starter-模块名
- 举例:spring-boot-starter-web、spring-boot-starter-jdbc
自定义命名空间
- 后缀:-spring-boot-starter
- 模式:模块-spring-boot-starter
- 举例:mybatis-spring-boot-starter
我们需要先创建一个父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-parent2.5.4 pom com.springboot springboot_custome_starter0.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-autoconfigurer8 8 org.springframework.boot spring-boot-starter-weborg.springframework.boot spring-boot-configuration-processortrue
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
@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包。
三、测试自定义starter我们创建个Module: springboot_starter,来测试系我们写的stater。
1. pom.xml
com.springboot fztx-spring-boot-starter0.0.1-SNAPSHOT
2.浏览
http://localhost:8080/
由于在自动配置上设置了
@ConditionalOnProperty(value = "fztx.hello.name")
但我们还没有配置。so......
3. application.properties
fztx.hello.name="CSDN"
再次访问:http://localhost:8080/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)