目录
IDEA使用Spring initializr 创建SpringBoot项目超时
自定义starter
1、starter启动原理
2、自定义starter
3、总结:
创建时用阿里的service url: https://start.aliyun.com
面试时,面试官可能会问你如何 实现一个自定义的 SpringBoot starter,或者说,springboot 如何加载我们自己的 jar 包
引入starter --- xxxAutoConfiguration --- 容器中放入组件 ---- 绑定xxxProperties ---- 配置项
创建一个名为 boot-09-customer-starter 空工程,工程下面新建两个模块
4.0.0
com.demo
hello-spring-boot-starter
1.0-SNAPSHOT
com.demo
hello-spring-boot-starter-autoconfigure
0.0.1-SNAPSHOT
hello-spring-boot-starter-autoconfigure
的pom.xml如下:
4.0.0
com.demo
hello-spring-boot-starter-autoconfigure
0.0.1-SNAPSHOT
hello-spring-boot-starter-autoconfigure
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
2.4.0
1.8
org.springframework.boot
spring-boot-starter
hello-spring-boot-starter-autoconfigure 的项目结构如下
package com.demo.hello.auto;
import com.demo.hello.bean.HelloProperties;
import com.demo.hello.service.HelloService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author chenjianbing
* @create 2021-09-19 19:08
* 自动配制类
*/
@Configuration
/**
* EnableConfigurationProperties的作用
* 1、开启HelloProperties配置绑定功能
* 2、把这个HelloProperties这个组件自动注册到容器中
*/
@EnableConfigurationProperties(HelloProperties.class)
public class HelloServiceAutoConfiguration {
@ConditionalOnMissingBean(HelloService.class)//当容器中没有时
@Bean //@Bean 用在方法上,告诉Spring容器,你可以从下面这个方法中拿到一个Bean
public HelloService helloService(){
HelloService helloService = new HelloService();
return helloService;
}
}
package com.demo.hello.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* @author chenjianbing
* @create 2021-09-19 18:52
* 将properties文件中的内容,封装到JavaBean中,以供随时使用
*/
@ConfigurationProperties("bingge.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;
}
}
package com.demo.hello.service;
import com.demo.hello.bean.HelloProperties;
import org.springframework.beans.factory.annotation.Autowired;
/**
* @author chenjianbing
* @create 2021-09-19 18:47
* 默认不要放在容器中
*/
public class HelloService {
@Autowired
HelloProperties helloProperties;
public String sayHello(String userName) {
return helloProperties.getPrefix() + ": "+userName+">"+helloProperties.getSuffix();
}
}
spring.factories
在spring.factories中显示指定这些配置类的目录,注意“,”后不要有空格之类的符号,就只写该类的全路径,不然会出现无法找到此bean的错误。
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.demo.hello.auto.HelloServiceAutoConfiguration
用maven插件,将两工程install到本地。记得要把 hello-spring-boot-starter-autoconfigure 的 test 包删除
接下来,测试使用自定义starter,用Spring Initializr创建名为boot-09-customer-starter-test工程,引入hello-spring-boot-starter依赖,其pom.xml如下:
4.0.0
com.example
boot-09-customer-starter-test
0.0.1-SNAPSHOT
boot-09-customer-starter-test
Demo project for Spring Boot
1.8
UTF-8
UTF-8
2.4.1
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
com.demo
hello-spring-boot-starter
1.0-SNAPSHOT
org.springframework.boot
spring-boot-dependencies
${spring-boot.version}
pom
import
org.apache.maven.plugins
maven-compiler-plugin
3.8.1
1.8
UTF-8
org.springframework.boot
spring-boot-maven-plugin
2.4.1
com.example.boot.Boot09CustomerStarterTestApplication
repackage
repackage
application.properties
# 应用名称
spring.application.name=boot-09-customer-starter-test
# 应用服务 WEB 访问端口
server.port=8080
bingge.hello.prefix=江西
bingge.hello.suffix=你好
package com.example.boot.controller;
import com.demo.hello.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author chenjianbing
* @create 2021-09-19 20:26
*/
@RestController
public class HelloController {
@Autowired
HelloService helloService;
@GetMapping("hello")
public String sayHello(){
String s = helloService.sayHello("张三");
return s;
}
}
启动服务
第一步,创建xxx-spring-boot-starter
工程
第二步,引入 Spring Boot 的基础依赖
第三步,创建xxxAutoConfiguration
第四步,在xxx-spring-boot-starter
工程的 resources 包下创建META-INF/spring.factories
文件
可能遇到的问题
springboot 自定义starter的过程以及遇到的问题