开发者学堂课程【SpringBoot快速掌握 - 核心技术:自定义 starter】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/612/detail/9283
自定义 starter
Spring Boot最强大的一个特点,将所有场景都抽取成了自定义 starters 场景启动器。通过引入 Spring Boot提供的场景启动器,就能使用到相应的场景功能,比如aop 功能,jpa 功能等等,并且引入了这些场景启动器之后,这些功能也自动配置,用户只需要在配置文件当中进行少量的数据配置,即使是这样 Spring Boot也不能囊括开发中所有的场景,往往需要自定义 starters,简化对 Spring Boot的使用。当写好某些场景的 starters 之后,别的开发人员可以直接引用 starters,就不需要做过多的配置。
一、 自定义 starter
starter :1、这个场景需要使用到的依赖是什么?2、如何编写自动配置
以WebMvcAutoConfiguration为例
@Configuration //指定这个类是一个配置类
@Conditiona
lo
nXXX //在指定条件成立的情况下自动配置类生效
@AutoConfigureAfter //指定自动配置类的顺序
@Bean //给容器中添加组件
@ConfigurationPropertie
/
/ 结合相关xxxProperties类来绑定相关的配置
@EnableConfigurationProperties //让xxxProperties生效加入到容器中
自动配置类要能加载将需要启动就加载的自动配置类,配置在META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoconfiguration,\
自动配置类就能生效
•启动器(starter):
启动器模块是一个空 JAR 文件,仅提供辅助性依赖管理,这些依赖可能用于自动装配或者其他类库
先编写一个 xxxx-starter 启动器,自动配置再来写 x
xxx-starter-autoconfigurer
模块,启动器引入,依赖配置,然后别人要使用就来依赖这个启动器,自动引入自动配置。
3、模式:启动器只用来做依赖导入;专门来写一个自动配置模块;启动器依赖自动配置;别人只需要引入启动器(starter)
mybatis-spring-boot-starter
;自定义启动器名-spring-boot-starter
创建一个新的项目
一个是自动配置的添加一些 Modules,创建一个 new Module使用 Spring Initializr,先创 Maven 工程,Groupld
com.atguigu.starter
Artifactld
atguigu-spring-boot-starter
Version
1.0-SNAPSHOT
点击 Next,再创建一个 Spring Initializr初始化器。
Empty Project这个空工程,创建一个启动器,这个启动器只用来导入、依赖。初始化向导,选择 Spring Boot版本为1.5.10
<!--启动器-->
<dependencies>
<!--引入自动配置模块-->
<dependency>
<groupId>com.atguigu.starter</groupId>
<artifactId>atguigu-spring-boot-starter-autoconfigurer</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
<!--引入spring-boot-starter;所有starter的基本配置-->
<dependency>
<groupId>org. springframework . boot</ groupId>
<artifactId>spring- boot- starter</ artifactId>
</dependency>
</dependencies>
H
elloService
package com. atguigu.starter;
public class HelloService {
HelloProperties helloProperties;
public String sayHellAtguigu(String name){
return
HelloProperties.getPrefix()+”-“+ name + HelloProperties.getSuffix();
}
}
H
elloProperties
package com. atguigu. starter ;
import org. springframework . boot . context . properties . Configurat ionProperties;
@ConfigurationProperties(prefix = "atguigu.hello")
public class HelloProperties {
private String prefix;
private String suffix;
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public String getSuffix() {
return suffix;
}
public void setSuffix(String suffix) {
this. suffix = suffix;
}
}
HelloServiceAutoConfiguration
public class HelloService {
HelloProperties helloProperties ;
public String sayHellAtguigu(String name){
return helloProperties. getPrefix()+"-" +name +helloProperties . getSuffix();
}
@Configuration
@ConditionalOnWebApplication //web应用才生效
@EnableConfigurat. ionProperties (HelloProperties .class)
public class HelloServiceAutoConfiguration {
@Autowired
HelloProperties helloProperties;
@Bean
public HelloService helloService(){
HelloService service = new
HelloService();
service. setHelloProperties (helloProperties);
return service;
}
}
先安装autoconfigurer,install,装到仓库里,自动配置包装到仓库里,启动器也撞到仓库里。
检测是否引用好了,创建一个新项目,测试这个启动器是否能工作。
package com. atguigu. springboot . controller;
import com. atguigu. starter . HelloService;
import org . springframework . beans . factory . annotat ion . Autowired ;
import org . springframework . web. bind. annotation . GetMapping;
import org. springframework . web . bind . annotat ion . RestController ;
@RestController
public class HelloController {
@Autowired
HelloService helloService ;
@GetMapping("/hello")
public String hello(){
return helloService. sayHel 1Atguigu( name: "haha");
}
}
atguigu. hello. prefix=ATGUIGU
atguigu . hello. suffix=HELLO WORLD
结果:引入成功,正确启动。
浏览器中访问:l
ocalhost:8080/hello
显示结果:
•启动器(starter):
-启动器模块是一个空 JAR 文件,仅提供辅助性依赖管理,这些依赖可能用于自动装配或者其他类库。命名规约:•推荐使用以下命名规约;
•官方命名空间-前缀:"spring-boot-starter-
"-模式:spring-boot-starter-
模块名-举例:spring-boot-starter-weby spring-boot-starter-actuator、spring-boot-starter-jdbc
•自定义命名空间-后缀:"-spring-boot-starter
"-模式:模块-spring-boot-starter
-举例:mybatis-spring-boot-starter