SpringBoot
先说一句,SpringBoot牛批!!!
Spring的底层:
Spring Framework
SpringBoot的作用:
是整合Spring技术栈的一站式框架
石建华Spring技术栈的快速开发脚手架
SpringBoot优点:
- 创建独立Spring应用
- 内嵌web服务器
- 自动starter依赖,简化构建配置
- 自动配置Spring以及第三方功能
- 提供生产级别的键控、健康检查及外部化配置
- 无代码生成、无须编写xml
SpringBoot缺点:
- 人称版本帝,迭代快,需时刻关注变化
- 封装太深,内部原理复杂,不易精通
微服务:
- 微服务是一种架构风格
- 一个应用拆分为一组小型服务
- 每个服务运行在自己的进程内,也就是可独立部署和升级
- 服务之间使用轻量级HTTP交互
- 服务围绕业务功能拆分
- 可以由全自动部署机制独立部署
- 去中心化,服务自治。服务可以使用不同的语言、不同的存储技术
分布式:
1.分布式的困难:
- 远程调用
- 服务发现
- 负载均衡
- 服务容错
- 配置管理
- 服务监控
- 链路追踪
- 日志管理
- 任务调度
2.分布式的解决:
SpringBoot + SpringCloud
快速入门
引入依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
主程序
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class,args);
}
}
小测试
@RestController
public class HelloController {
@RequestMapping("/hello")
public String handle01(){
return "Hello,SpringBoot2";
}
}
然后直接启动main方法即可
父项目几乎声明了我们开发中需要的jar包
若要自己更改某一类jar包的版本,可用properties标签
开发导入starter场景启动器
- 见到很多 spring-boot-starter- :就某种场景
- 只要引入starter,这个场景的所有常规需要的依赖都会自动引入
- SpringBoot所有支持的场景
https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter
- 见到的 *-spring-boot-starter: 第三方为我们提供的简化开发的场景启动器。
- 所有场景启动器最底层的依赖spring-boot-starter
自动配置
- 自动配好Tomcat
- 引入Tomcat依赖。
- 配置Tomcat
- 自动配好SpringMVC
- 引入SpringMVC全套组件
- 自动配好SpringMVC常用组件(功能)
- 自动配好Web常见功能,如:字符编码问题
- SpringBoot帮我们配置好了所有web开发的常见场景
- 默认的包结构
- 主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来
- 无需以前的包扫描配置
- 想要改变扫描路径,@SpringBootApplication(scanBasePackages=“cn.huangyy”)或者@ComponentScan(需加上@SpringBootConfiguration@EnableAutoConfiguration) 指定扫描路径
- 各种配置拥有默认值
- 默认配置最终都是映射到某个类上,如:MultipartProperties
- 配置文件的值最终会绑定每个类上,这个类会在容器中创建对象
- 按需加载所有自动配置项
- 非常多的starter
- 引入了哪些场景这个场景的自动配置才会开启
- SpringBoot所有的自动配置功能都在 spring-boot-autoconfigure 包里面
注释
@Configuration
@Configuration//告诉SpringBoot这是一个配置类==配置文件
public class MyConfig {
@Bean//给容器中添加组件。一方法名作为组件的id,返回类型就是组件类型,返回值就是组件在容器中的实例
public User user01(){
return new User("zhangsan",22);
}
@Bean("tom")//可自定义组件名
public Pet cat(){
return new Pet("Cat");
}
}
- 配置类里面使用@Bean标注在方法上给容器注册组件,默认是单实例的
- 配置类本身也是一个组件
- 外部无论对配置类中的组件注册方法条用多少次获取的都是之前注册容器中的实例对象
- 如果@Configuration(proxyBeanMethods=true:Full模式)代理对象调用方法。SpringBoot会保持调用方法其单实例
- @Import({User.class, DBHelper.class})给容器自动创建出这两种类型的组件,默认组件名为全类名
@Conditional
条件装备
- @ConditionalOnBean(name = “tom”)有名为tom的组件时
- @ConditionalOnMissBean(name = “tom”)没有名为tom的组件时
- 还有很多
@ImportResource
如@ImportResource(“classpath:beasns.xml”)
可以导入xml文件,并自动解析注入容器
@ConfigurationProperties
配置绑定
-
第一种方式
@Component
@ConfigurationProperties(prefix = “mycar”) -
第二种方式
@ConfigurationProperties(prefix = “mycar”)
在配置类上加@EnableConfigurationProperties(Car.class)开启car属性配置功能,把car自动注入到容器中
@EnableAutoConfiguration的底层
用到了@AutoConfigurationPackage
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
@AutoConfigurationPackage的底下
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
利用Registrar给容器导入一系列组件
AutoConfigurationImportSelector.class的底下:
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return NO_IMPORTS;
} else {
AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
}
getAutoConfigurationEntry(annotationMetadata)
给容器中批量导入组件
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
获取到所有需要导入到容器中的配置
- 利用工厂加载
Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader)
得到所有的组件 - 从"META-INF/spring.factories"位置加载一个文件。默认扫描当前系统里所有这个位置的文件。
- 文件中写死了Springboot已启动就要给容器中加载的所有配置类,当中有127个
- 虽然启动是默认127个全部加载,但是最终会按需配置
- SpringBoot默认会在底层配置好所有组件,但如果用户自己配好则以用户的优先。
总结:
- SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
- 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
- 生效的配置类就会给容器中装配很多组件
- 只要容器中有这些组件,相当于这些功能就有了
- 定制化配置
- 用户直接自己@Bean替换底层的组件
- 用户去看这个组件是获取的配置文件什么值就去修改。
xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 ----> application.properties
开发小技巧
1.Lombok 简化JavaBean的开发
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
有注解:
- @AllArgsConstructor
- @NoArgsConstructor
- @ToString
- @Data
- 等等
2.dev-tools
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
ctrl+f9