SpringBoot(八)


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
2
3
4
5
6
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

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)后,提供对应配置属性。
配置优先级从高到低

  1. 命令行参数
    • –server.port=8085
  2. java系统属性
    • -Dserver.port=8084
  3. application.properties
1
server.port=8080
  1. application.yml(推荐使用)
1
2
server:
port: 8081
  1. application.yaml
1
2
server:
port: 8082

打包后可在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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Autowired
private ApplicationContext applicationContext;//IOC容器对象
@Test
public void testGetBean(){
//根据bean的名称获取
DeptController cbean1=(DeptController)applicationContext.getBean("deptController");
//DeptMapper mbean1=(DeptMapper)applicationContext.getBean("deptMapper");

System.out.println(cbean1);
//System.out.println(mbean1);
//根据bean的类型获取
DeptController cbean2 = applicationContext.getBean(DeptController.class);
//DeptMapper mbean2 = applicationContext.getBean(DeptMapper.class);
System.out.println(cbean2);
//System.out.println(mbean2);

//根据bean的名称 及 类型获取
DeptController cbean3 = applicationContext.getBean("deptController", DeptController.class);
//DeptMapper mbean3 = applicationContext.getBean("deptMapper", DeptMapper.class);
System.out.println(cbean3);
//System.out.println(mbean3);
}

bean作用域

Spring支持五种作用域,后三种(不常用)在web环境才生效:

  1. singleton(默认):容器内同名称的bean只有一个实例(单例)(默认)
  2. prototype:每次使用该bean时会创建新的实例(非单例)
  3. request
  4. session
  5. application

可以通过@Scope注解来进行配置作用域。

@Scope(“作用域”)

  1. 默认singleton的bean,在容器启动时被创建,可使用@Lazy注解来延迟初始化(延迟到第一次使用时)
  2. prototype的bean,每一次使用该bean时都会创建一个新的实例。
  3. 实际开发中,绝大部分bean都是单例,无需配置scope属性

第三方bean

若要管理bean对象来自第三方(非自定义),是无法用@Component及衍生注解声明bean的,需用到@Bean。

若要管理第三方的bean对象,建议对这些bean进行集中分类配置,可通过@Configuration注解声明一个配置类。

通过@Bean注解的name或value属性可以声明bean的名称,若不指定,默认bean的名称就是方法名。

若第三方bean需依赖其他bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。

@Component及衍生注解与@Bean注解使用场景

  • 项目中自定义的,使用@Component及其衍生注解
  • 项目中引入第三方的,使用@Bean注解

1
2
3
4
5
6
7
@Configuration
public class CommonConfig {
@Bean
public SAXReader saxReader(){
return new SAXReader();
}
}

自动配置

SpringBoot的自动配置就是当spring容器启动后,一些配置类,bean对象就自动存入到IOC容器中,不需去手动声明,从而简化开发,省去繁琐的配置操作

方案

方案一

1
2
3
4
5
6
7
8
@ComponentScan({"com.example","com.itheima"})
@SpringBootApplication
public class SpringbootWebConfig2Application {

public static void main(String[] args) {
SpringApplication.run(SpringbootWebConfig2Application.class, args);
}
}

方案二

@Import导入,使用@Import导入的类会被Spring加载到IOC容器中,导入形式主要有以下几种:

  1. 导入普通类
  2. 导入配置类
  3. 导入ImportSelector接口实现类
1
2
3
4
5
6
7
8
9
10
//@Import({HeaderParser.class})
//@Import({HeaderConfig.class})
@Import({MyImportSelector.class})
@SpringBootApplication
public class SpringbootWebConfig2Application {

public static void main(String[] args) {
SpringApplication.run(SpringbootWebConfig2Application.class, args);
}
}
  1. @EnableXxxx注解,封装@Import注解
1
2
3
4
5
6
7
8
9
@EnableHeaderConfig
@SpringBootApplication
public class SpringbootWebConfig2Application {

public static void main(String[] args) {
SpringApplication.run(SpringbootWebConfig2Application.class, args);
}
}

@SpringBootApplication

该注解由三个部分组成:

  • @SpringBootConfiguration:该注解与@Configuration注解作用相同,用来声明当前也是一个配置类
  • @ComponentScan:组建扫描,默认扫描当前引导类所在包及其子包
  • @EnableAutoConfiguration:SpringBoot实现自动化配置的核心注解

@Conditional

按照一定的条件进行判断,在满足给定条件后才会注册对应的bean对象到SpringIOC容器中。

子注解:

  1. @ConditionalOnClass:判断环境中是否有对应字节码文件,才注册bean到IOC容器
  2. @ConditionalOnMissingBean:判断环境中没有对应的bean(类型或名称),才注册bean到IOC容器
  3. @ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器

Author: ljs
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source ljs !
评论
  TOC