首页 > 编程语言 >JavaWeb学习笔记——第十四天

JavaWeb学习笔记——第十四天

时间:2024-04-04 20:11:23浏览次数:31  
标签:JavaWeb Spring 配置 Bean 笔记 第十四天 bean spring 注解

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 applicationContect; //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开发模块。

标签:JavaWeb,Spring,配置,Bean,笔记,第十四天,bean,spring,注解
From: https://www.cnblogs.com/zgg1h/p/18114546

相关文章

  • Python数据分析与可视化笔记 九 分类问题
    分类        分类是找出数据库中一组数据对象的共同特点,并按照分类模式将其划分为不同的类,其目的是通过分类模型,将数据库中的数据项映射到某个给定的类别。        分类学习是一类监督学习的问题,训练数据会包含其分类结果,根据分类结果分为以下几种问题。1.......
  • 第01章 JavaWeb基础
    B/S架构是Brower/Server的缩写,即浏览器/服务器结构。在这种结构中,客户端不需要开发任何用户界面,而是通过浏览器(如IE,Firefox,Chrome,Safari等等)向服务器发送请求,由服务器进行处理后将响应结果返回浏览器,最后浏览器将结果内容展示出来。我们写的JavaWeb程序是在服务器端运行的。W......
  • QT基础(B站自学笔记)
    1.程序运行原理#include"mainwindow.h"#include<QApplication>intmain(intargc,char*argv[]){QApplicationa(argc,argv);MainWindoww;//创建窗口对象ww.show();//显示窗口returna.exec();//进入事件循环}2.QOBJECT宏#ifndef......
  • 《C++程序设计》阅读笔记【2-程序结构】
    ......
  • [算法学习笔记] 线段树
    前言线段树可以维护一系列区间问题。包括但不限于区间加,区间乘,区间最值等。本文主要介绍最基础的区间修改区间查询。你可以认为是模板线段树的解析。本文将持续更新。例题给定一个数列,需要支持如下两种操作:\(1\)\(x\)\(y\)\(k\)将区间\([x,y]\)中每一个数加\(k\)......
  • SpringMVC学习笔记
    1、概述基于java实现的实现mvc模型的轻量级web框架SpringMVC是一种表现层的框架技术,用于web层的功能开发,是对Servlet进行的封装主要的作用是接收请求和数据,响应结果,所以如何处理请求和响应是SpringMVC的重点​ 之前的开发将后端服务器Servlet拆分成三层,分别是web、service......
  • 稀碎从零算法笔记Day37-LeetCode:所有可能的真二叉树
    今天的每日一题,感觉理解的还不够深,有待加深理解题型:树、分治、递归链接:894.所有可能的真二叉树-力扣(LeetCode)来源:LeetCode题目描述给你一个整数 n ,请你找出所有可能含 n 个节点的 真二叉树 ,并以列表形式返回。答案中每棵树的每个节点都必须符合 Node.val==0 ......
  • 稀碎从零算法笔记Day36-LeetCode:H指数
    有点绕的一个题,题目描述的有点奇怪(可以看下英文?)题型:数组、模拟链接:274.H指数-力扣(LeetCode)来源:LeetCode题目描述给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。根据维基百科上 h指数......
  • SOLID原则笔记
     SOLID单一职责:最初的定义是:“一个类的改变永远不应该有多个原因。”新定义:“每个模块应该做一件事,并且做好”。  开闭原则最初的定义是:“软件实体应该对扩展开放,但对修改关闭。”新定义:“您应该能够使用和添加模块而无需重写它。” 里氏替换原则原始定义:“如果S......
  • [笔记]石子合并问题整理(更新中)
    [Contents]无环,朴素算法,\(O(n^3)\)有环,朴素算法,\(O(n^3)\)GrsiaWachs、四边形不等式优化无环,朴素算法,\(O(n^3)\)例题:P1775石子合并(弱化版)用\(f[i][j]\)表示\(i\simj\)的最小得分,枚举长度\(len=2\simn\),对于每个长度,枚举左端点\(l\),算出右端点\(r\),然后再枚举从分割位置......