JavaWeb学习笔记——第十四天

SpringBoot原理

配置优先级

配置文件

  • SpringBoot 中支持三种格式的配置文件:application.properties,application.yml,application.yaml。

  • 其优先级为:application.properties > application.yml > application.yaml。

注意事项

  • 虽然springboot支持多种格式配置文件,但是在项目开发时,推荐统一使用一种格式的配置 (yml是主流)。

其他配置方式

  • SpringBoot 除了支持配置文件属性配置,还支持Java系统属性命令行参数方式进行属性配置端口号:
  • Java系统属性:-Dserver.port=端口号;命令行参数:--server.port=端口号
  • 优先级为:命令行参数 > Java系统属性。

在IDEA中配置

IDEA中配置端口号

在命令行中配置

  1. 执行maven打包指令package生成jar包。
  2. 执行java指令,运行jar包,同时进行端口配置:
java -Dserver.port=端口号 -jar jar包名称.jar --server.port=端口号
注意事项
  • Springboot项目进行打包时,需要引入插件 spring-boot-maven-plugin (基于官网骨架创建项目时,会自动添加该插件)。

优先级总结

  • 命令行参数 > Java系统属性 > application.properties > application.yml > application.yaml。

Bean管理

获取Bean

  • 默认情况下,Spring项目启动时,会把bean都创建好放在IOC容器中,如果想要主动获取这些bean,可以通过如下方式:

    • 首先获取IOC容器对象:
    @Autowired
    private ApplicationContext applicationContext; //IOC容器对象
    
    • 根据name获取bean:Object getBean(String name)
    • 根据类型获取bean:<T> T getBean(Class<T> requiredType)
    • 根据name获取bean(带类型转换):<T> T getBean(String name, Class<T> requiredType)

注意事项

  • 上述所说的 【Spring项目启动时,会把其中的bean都创建好】还会受到作用域及延迟初始化影响,这里主要针对于默认的单例非延迟加载的bean而言。

bean作用域

  • Spring支持五种作用域,后三种在web环境才生效:
作用域 说明
singleton 容器内同 名称 的 bean 只有一个实例(单例)(默认)
prototype 每次使用该 bean 时会创建新的实例(非单例)
request 每个请求范围内会创建新的实例(web环境中,了解)
session 每个会话范围内会创建新的实例(web环境中,了解)
application 每个应用范围内会创建新的实例(web环境中,了解)
  • 可以通过在Bean类上方使用 @Scope 注解来进行配置作用域:@Scpoe("作用域名称")

几点注意

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

第三方bean

  • 如果要管理的bean对象来自于第三方(不是自定义的),是无法用 @Component 及衍生注解声明bean的,就需要用到 @Bean注解。
  • 若要管理的第三方bean对象,建议对这些bean进行集中分类配置,可以通过 @Configuration 注解声明一个配置类。
@Configuration
public class CommonConfig {
    @Bean //将当前方法的返回值交给IOC容器管理,称为IOC容器Bean
    public SAXReader saxReader(){
        return new SAXReader();
    }
}

几点注意

  • 通过@Bean注解的name或value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名。
  • 如果第三方bean需要依赖其它bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。

@Component及衍生注解与@Bean注解的选择

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

SpringBoot原理

  • Spring框架是世界上最流行的Java框架,它提供了很多优秀的子框架,而所有Spring家族中的框架都是基于Spring Framework这一基础框架的。
  • 但是Spring Framework使用起来非常繁琐,体现在依赖和配置上。
  • Spring Boot框架是用来简化Spring框架的开发的,它开发起来更加简单、快捷,也是Spring家族中最流行的一个子框架。
  • Spring Boot框架提供了两个非常重要的功能:起步依赖和自动配置,这些功能使它使用起来非常简单、快捷。

起步依赖

  • Spring Boot的起步依赖的功能是利用Maven的依赖传递特性实现的:它在起步依赖中提供了当前程序开发所需要的所有的常见依赖,并且做了版本的适配。

自动配置

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

自动配置原理

导入第三方包的方法
方案一
  • @ComponentScan组件扫描:在引导类上加上@ComponentScan注解,其属性值为要导入的包名字符串数组。
  • 缺点:使用繁琐,性能低。
方案二
  • @Import导入:使用@Import导入的类会被Spring加载到IOC容器中,导入形式主要有以下几种:

    • 导入普通类。
    • 导入配置类。
    • 导入ImportSelector接口实现类。
    • 使用@EnableXxxx注解,封装@Import注解。
  • 其中第四种形式使用起来最为方便,也是Spring Boot采用的方式。

自动配置原理
  • @SpringBootApplication注解该注解标识在SpringBoot工程引导类上,是SpringBoot中最最最重要的注解。该注解由三个部分组成:
组成部分 说明
@SpringBootConfiguration 该注解与 @Configuration 注解作用相同,用来声明当前也是一个配置类
@ComponentScan 组件扫描,默认扫描当前引导类所在包及其子包
@EnableAutoConfiguration SpringBoot实现自动化配置的核心注解
  • 在EnableAutoConfiguration注解上添加了@Import注解,其属性值为AutoConfigurationImportSelector.class。
  • 在AutoConfigurationImportSelector类中定义了几个方法,其作用为从被引入的依赖的包的META-INF/spring/org.springframework.boot.AutoConfiguration.imports和META-INF/spring/spring.factories这两个文件中引入配置信息。
  • 这两个文件中保存的即是要配置的自动配置类的全类名。
  • 最后SpringBoot会根据这些文件并按照@Conditional注解条件装配Bean。
注意事项
  • spring.factories文件是Spring Boot早期版本中使用的,SpringBoot2.7.x引入了org.springframework.boot.AutoConfiguration.imports文件并兼容spring.factories文件,Spring3.x版本中已经移除spring.factories文件。
@Conditional
  • 作用:按照一定的条件进行判断,在满足给定条件后才会注册对应的bean对象到Spring IOC容器中。

  • 位置:方法、类。

  • @Conditional 本身是一个父注解,派生出了大量的子注解:

    • @ConditionalOnClass:判断环境中是否有对应字节码文件,有才注册bean到IOC容器。属性为name,其值为要判断的类的全类名。
    @Bean
    @ConditionalOnClass(name = "io.jsonwebtoken.Jwts") //当前环境存在指定的这个类时,才声明该bean
    public HeaderParser headerParser(){...}
    
    • @ConditionalOnMissingBean:判断环境中没有对应的bean(根据类型或名称判断) ,没有才注册bean到IOC容器。属性为value,其值为要判断的类的全类名;name,其值为要判断的bean对象的对象名。默认为当前被注解的bean。
    @Bean
    @ConditionalOnMissingBean //当不存在当前类型的bean时,才声明该bean
    public HeaderParser headerParser(){...}
    
    • @ConditionalOnProperty:判断配置文件中有对应属性和值,有才注册bean到IOC容器。属性为name,其值为要判断的配置文件中的属性;havingValue,其值为要判断的配置文件中的属性对应的值
    @Bean
    @ConditionalOnProperty(name = "name",havingValue = "zgg1h") //配置文件中存在对应的属性和值,才注册bean到IOC容器
    public HeaderParser headerParser(){...}
    

自定义starter

  • 在实际开发中,经常会定义一些公共组件,提供给各个项目团队使用。而在SpringBoot的项目中,一般会将这些公共组件封装为SpringBoot的starter。
  • 一般在xxxx-spring-boot-starter模块中实现依赖管理功能,在xxxx-spring-boot-autoconfigure模块实现自动配置功能,并将autoconfigure模块引入到starter模块中。
步骤
  • 创建xxxx-spring-boot-starter模块
  • 创建xxxx-spring-boot-autoconfigure模块,在starter中引入该模块。
  • 在xxxx-spring-boot-autoconfigure模块中的定义自动配置功能,并定义自动配置文件META-INF/spring/xxxx.imports。

Web后端开发总结

  • Web后端开发使用到的技术及其归属框架如下:
总结
  • 其中SpringMVC、Spring Framework和Mybatis被统称为SSM。
  • SpringMVC框架即为Spring Framework中的web开发模块。
posted @   zgg1h  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示