SpringBoot(八)
SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。
Spring程序缺点:
- 依赖设置繁琐
- 配置繁琐
SpringBoot程序优点
- 起步依赖(简化依赖配置):本质上就是一个maven坐标,整合了完成一个功能需要的所有坐标
- 自动配置(简化常用工程相关配置):在boot程序启动后。一些bean对象会自动注入到ioc容器,不需手动声明。
- 其他特性
- 内嵌的Tomcat,Jetty,无需部署war文件
- 外部化配合
- 不需xml配置(properties/yml)
概述
parent
开发springboot程序要继承spring-boot-starter-parent
spring-boot-starter-parent中定义若干个依赖管理
继承parent模块可避免多个依赖使用相同技术时出现依赖版本冲突
继承parent的形式可采用引入依赖的形式实现效果
starter
开发springboot程序需要导入坐标时通常导入对应的starter
每个不同的starter根据功能不同,通常包含多个依赖坐标
使用starter可实现快速配置的效果,达到简化配置的目的
引导类
springboot工程提供引导类来启动程序
springboot工程启动后创建并初始化spring容器
启动方式:
1 | @SpringBootApplication |
springboot的引导类是boot工程的入口,运行main方法就可以启动项目。
springboot工程运行后初始化spring容器,扫描引导类所在包加载bean
内嵌tomcat
内嵌tomcat服务器是springboot辅助功能之一。
内嵌tomcat工作原理是将tomcat服务器作为对象运行,并将该对象交给spring容器管理。
变更内嵌服务器思想是取出现有服务器,添加全新的服务器。
内置服务器:
- tomcat(默认):Apache出品,应用面广,浮在若干较重的组件
- jetty:更轻量级,负载性能远不及tomcat
- undertow:undertow,负载性能勉强跑赢tomcat
配置文件
springboot中导入对应的stater(spring-boot-starter-web包含spring-boot-starter)后,提供对应配置属性。
配置优先级从高到低:
- 命令行参数
- –server.port=8085
- java系统属性
- -Dserver.port=8084
- application.properties
1 | server.port=8080 |
- application.yml(推荐使用)
1 | server: |
- application.yaml
1 | server: |
打包后可在cmd中执行java指令,运行jar包:
java –Dserver.port=8084 -jar 名字.jar –server.port=8085
注意事项:SpringBoot项目进行打包时,需引入插件spring-boot-maven-plugin(基于官网骨架创建项目,会自动添加该插件)
获取bean
默认情况下,Spring项目启动时,会把bean都创建好(这里主要针对默认的单例非延迟加载的bean)放在IOC容器中,若想主动获取bean,可通过以下方式:
- 根据name获取bean:
- Object getBean(String name)
- 根据类型获取bean:
T getBean(Class requiredType)
- 根据name获取bean(带类型转换)
T getBean(String name,Class requiredType)
例:
1 | @Autowired |
bean作用域
Spring支持五种作用域,后三种(不常用)在web环境才生效:
- singleton(默认):容器内同名称的bean只有一个实例(单例)(默认)
- prototype:每次使用该bean时会创建新的实例(非单例)
- request
- session
- application
可以通过@Scope注解来进行配置作用域。
@Scope(“作用域”)
注:
- 默认singleton的bean,在容器启动时被创建,可使用@Lazy注解来延迟初始化(延迟到第一次使用时)
- prototype的bean,每一次使用该bean时都会创建一个新的实例。
- 实际开发中,绝大部分bean都是单例,无需配置scope属性
第三方bean
若要管理bean对象来自第三方(非自定义),是无法用@Component及衍生注解声明bean的,需用到@Bean。
若要管理第三方的bean对象,建议对这些bean进行集中分类配置,可通过@Configuration注解声明一个配置类。
通过@Bean注解的name或value属性可以声明bean的名称,若不指定,默认bean的名称就是方法名。
若第三方bean需依赖其他bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。
@Component及衍生注解与@Bean注解使用场景:
- 项目中自定义的,使用@Component及其衍生注解
- 项目中引入第三方的,使用@Bean注解
例:
1 | @Configuration |
自动配置
SpringBoot的自动配置就是当spring容器启动后,一些配置类,bean对象就自动存入到IOC容器中,不需去手动声明,从而简化开发,省去繁琐的配置操作
方案
方案一
1 | @ComponentScan({"com.example","com.itheima"}) |
方案二
@Import导入,使用@Import导入的类会被Spring加载到IOC容器中,导入形式主要有以下几种:
- 导入普通类
- 导入配置类
- 导入ImportSelector接口实现类
1 | //@Import({HeaderParser.class}) |
- @EnableXxxx注解,封装@Import注解
1 | @EnableHeaderConfig |
@SpringBootApplication
该注解由三个部分组成:
- @SpringBootConfiguration:该注解与@Configuration注解作用相同,用来声明当前也是一个配置类
- @ComponentScan:组建扫描,默认扫描当前引导类所在包及其子包
- @EnableAutoConfiguration:SpringBoot实现自动化配置的核心注解
@Conditional
按照一定的条件进行判断,在满足给定条件后才会注册对应的bean对象到SpringIOC容器中。
子注解:
- @ConditionalOnClass:判断环境中是否有对应字节码文件,才注册bean到IOC容器
- @ConditionalOnMissingBean:判断环境中没有对应的bean(类型或名称),才注册bean到IOC容器
- @ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器