7天学完Spring:一文阐述完Bean对象和SpringBoot框架

前言

这一篇博客是整个系列的第二篇,承接上部分Bean和SpringBoot整个篇幅的叙述,笔者时间真的不多,赶秋招呢,8月正式开始,还要赶项目,不然简历都拿不出手,所以笔者的博客全都是挑重点写,还有一些API就是挑代表的演示一下,好了,不说了,开始这篇博客的内容。

一丶Bean的作用域和生命周期

<1>关于作用域的定义

什么是作用域呢?程序中变量的可用范围叫做作用域,或者说在源代码中定义变量的某个区域就叫做作用域

而 Bean 的作用域是指 Bean 在 Spring 整个框架中的某种行为模式,比如 singleton 单例作用域,就表示 Bean 在整个 Spring 中只有一份,它是全局共享的,那么当其他人修改了这个值之后,那么另一个人读取到的就是被修改的值。

<2>Bean的六种作用域

1>singleton:单例作⽤域(默认)【共用一个对象】- Spring

官方说明:(Default) Scopes a single bean definition to a single object instance for each SpringIoC container.
描述:该作用域下的Bean在IoC容器中只存在一个实例:获取Bean(即通过
applicationContext.getBean等方法获取)及装配Bean(即通过@Autowired注入)都是同一个对象。
场景:通常无状态的Bean使用该作用域。无状态表示Bean对象的属性状态不需要更新
备注:Spring默认选择该作用域

什么是单例模式?
在这里插入图片描述
可以看到当前Bean对象我没有加多余的注释,这就是一个单例作用域。如果此时有两个Bean对象A和B共用一个公共Bean对象,如果说A对公共的B修改了,那么此时B拿到的就是修改后的Bean对象。
那么问题就来了嗷?说说Bean的作用范围?
答:单例设计模式,只要当前的容器还在,那么我的这个Bean对象就在,所以我的范围就是容器的生命周期

2>prototype:原型作⽤域(多例作⽤域)【每次都拿的都是new的新对象】- Spring

官方说明:Scopes a single bean definition to any number of object instances.
描述:每次对该作用域下的Bean的请求都会创建新的实例:获取Bean(即通过applicationContext.getBean等方法获取)及装配Bean(即通过@Autowired注入)都是新的对象实例。
场景:通常有状态的Bean使用该作用域

那么多例作用域怎么写?
在这里插入图片描述
多例作用域就是我们每次拿到的都是new出来的新对象,这个我们后面演示

3>request:请求作⽤域【一次HTTP请求共享一个Bean】- Spring MVC

官方说明:Scopes a single bean definition to the lifecycle of a single HTTP request. That is,each HTTP request has its own instance of a bean created off the back of a single beandefinition. Only valid in the context of a web-aware Spring ApplicationContext.
描述:每次http请求会创建新的Bean实例,类似于prototype
场景:一次http的请求和响应的共享Bean
备注:限定SpringMVC中使用

这个我就不贴截图了哈,上面的是两个重点我们一定要掌握的,后面用到了再说,那么问题还是来上吧!说一说request请求作用域的范围?
回答:这个东西其实和我们的httpServletRequest和request以及一些其他的请求是类似的,作用范围都是当前的请求时间。也就是说你发一个请求创建一个request,但是它也就本次请求有效

4>session:会话作⽤域【一个会话里共享同一个session】-SpringMVC

官方说明::Scopes a single bean definition to the lifecycle of an HTTP Session. Only valid inthe context of a web-aware Spring ApplicationContext
描述:在一个http session中,定义一个Bean实例
场景:用户回话的共享Bean, 比如:记录一个用户的登陆信息
备注:限定SpringMVC中使用

然后我又来了哈!!!说说session的作用范围?
答:什么时候用到session呢?经常就是以下两种使用场景:
<1>会话机制
<2>访问敏感资源
所以如果从这两点来说,那么其实session最常见的作用范围就是登录之后注销时间之前,或者也可以说是超时前的有效时间

5>application:全局作⽤域【共享】-SpringMVC

官方说明:Scopes a single bean definition to the lifecycle of a ServletContext. Only valid inthe context of a web-aware Spring ApplicationContext.
描述:在一个http servlet Context中,定义一个Bean实例
场景:Web应用的上下文信息,比如:记录一个应用的共享信息
备注:限定SpringMVC中使用

这里我就直接回答了吧!
答:全局作用域作用范围,咋说呢,应用还在他就在

6>websocket:HTTP WebSocket 作⽤域【Spring WebSocket 项目中涉及到的作用域类型】- Spring WebSocket

官方说明:Scopes a single bean definition to the lifecycle of a WebSocket. Only valid in thecontext of a web-aware Spring ApplicationContext.
描述:在一个HTTP WebSocket的生命周期中,定义一个Bean实例
场景:WebSocket的每次会话中,保存了一个Map结构的头信息,将用来包裹客户端消息头。第一次初始化后,直到WebSocket结束都是同一个Bean。
备注:限定Spring WebSocket中使用

答:这里我没有问,因为这里我也不知道,但是我按照我之前的Servlet项目来说一下自己的理解,作用范围就是:成功登录之后和断开连接之前。因为websocket是验证成功之后,客户端发起websocket请求连接,然后客户端同意之后才建立成功。还有就是断开连接之前,当然这个断开连接就分情况了,这里就不多说了。

小tip:所以还不懂单例和多例作用域的区别的看这里

在这里插入图片描述
然后写代码打印一下看看?
在这里插入图片描述
在这里插入图片描述
可以看到,两个对象打印出来是一样的,也就是说这里是一个对象
在这里插入图片描述
然后打印一下看看
在这里插入图片描述
在这里插入图片描述

小tip:关于Bean的有状态和无状态

一个Bean对象,如果里面的属性会变化就是有状态,没有变化就是无状态

<2>Bean的生命周期(内含Bean的执行流程概述)

1.实例化 Bean(为 Bean 分配内存空间)
2.设置属性(Bean 注⼊和装配)

(1)首先就是启动容器加载配置文件
(2)然后去扫描包路径上的使用了Spring注解的类,然后把这些类注入到容器中(PS:这里如果有属性也使用了Spring注解,那么就要属性的注入在类之前,因为类里面的方法可能含有属性的使用,所以防止出现空指针,就有这样的情况)
(3)把这些Bean对象作为属性注入到我当前的Bean对象中来装配我Bean的属性

3.Bean的初始化

(1)实现了各种 Aware 通知的方法,如 BeanNameAware、BeanFactoryAware、ApplicationContextAware 的接口方法;
比如
Spring在初始化 bean,是需要给 bean 赋予 id(name)。
而设置 beanName 成功的话,就会生成一个 beadNameAware 通知。
(2)执行 BeanPostProcessor 初始化前置方法;
(3)执行 @PostConstruct 初始化方法,依赖注入操作之后被执行;(tip1):执行具有 @PostConstruct 注解的方法。【PostConstruct -> 初始化方法】
(tip2):执行 init-method 方法,是 Spring 中 配置文件里面 的 bean 标签所有具有的属性。
如果:这里两个都有,就先执行 @PostConstruct 注解的方法,然后执行 init-method 方法
(4)执行 BeanPostProcessor 初始化后置方法

4.使用Bean
5.销毁Bean

销毁容器的各种方法,如 @PreDestroy、DisposableBean 接口方法、destroy-method。

1>写个小代码来大概演示一下初始化过程

这里是引用
我这里没有使用.xml这种方式配置起始容器,所以这里我没有指定init_method(),他使用的是 @PostConstruct,所以没有init打印
在这里插入图片描述

2>说一下为什么第二步属性注入和第三步Bean对象初始化不能颠倒?

答:这个吧,初始化是干嘛的呢?初始化有一部分的工作就是给属性赋值,给对象初始化,但是这个时候如果你属性没有,对象也没有,是不是会造成空指针异常呢?

二丶关于SpringBoot

<1>来小伙,说一说你为啥要用SpringBoot?

Spring 的诞生是为了简化 Java 程序的开发的,而Spring Boot 的诞生是为了简化 Spring 程序开发的。Spring Boot 就是 Spring 框架的脚手架,它就是为了快速开发 Spring 框架而诞生的。

那么,来仔细阐述一下??
快速集成框架
Spring Boot 提供了启动添加依赖的功能,用于秒级集成各种框架。

内置运行容器
无需配置 Tomcat 等 Web 容器,直接运行和部署程序。


快速部署项目
无需外部容器即可启动并运行项目。


可以完全抛弃繁琐的 XML,使用注解和配置的方式进行开发。


支持更多的监控的指标,可以更好的了解项目的运行情况
这里关于监控杆指标,Spring Boot 有一个专门给它去做的 Actuator 监控指标。然后我们去继承这个监控指标的话,可以看到 Spring 项目运行的情况。比如:当前 Spring Boot 项目中,有多少个 bean,每个 bean 都是在那个平台上运行的,JVM 的版本号是多少;当前项目中有多少个定时目录,有多少个缓存。
它都是有详细描述的。


SpringBoot以“约定优于配置”的设计原则来简化开发
配置是什么意思呢?就是我们预定在那个目录下做哪个事情。这也是我们spring的设计思想,比如说我们在xml里面配置一个解析我们请求的类,这里我们这个类就不配置了。而是我们约定使用那种方式,通过这种方式节省去了我们大量的配置类,以它内部默认的一种约定去去建立我们的配置。

<2>SpringBoot的安装流程—在这里水个字数

先安装插件这里是引用
然后
在这里插入图片描述
这里根据自己的选择来
在这里插入图片描述
然后你要选择安装的依赖(是不是超级方便?)
在这里插入图片描述
在这里插入图片描述
然后就安装完毕啦!

<3>配置好后的xml文件略解+SpringBoot文件夹作用略解

首先就是来看看我们的xml文件里面有什么
这个是我们特别要拿出来说的在这里插入图片描述
然后还有其他一些东西
在这里插入图片描述

接着来说一说我们之后的SpringBoot项目里面的初始文件夹都是干嘛的
在这里插入图片描述

<4>关于项目运行和包路径错误

首先说第一个,项目运行,这里我们尝试写一个login.html的网页然后启动启动类,并且通过网页直接去访问就好不用配置tocat服务器,其内置了一个tomcat服务器在这里插入图片描述

然后这里是我们的包路径错误,演示一下
在这里插入图片描述

三丶关于SpringBoot文件配置

<1> .properties配置文件略解

1>格式

看我下面的格式
在这里插入图片描述
(1)你可以再这个配置文件里面干好多事情,比如说:配置端口号,配置用户名,配置密码,配置字符集,设计级别等等
(2)配置的时候注意一下,我这里的自定义配置内容还好,你的端口号啥的重要的内容是不能有空格的!!!!!!一定要注意!!!不能有空格!!!

2>使用配置值的方法

spring框架会自动根据需要注入的类型,将配置文件中字符串转换为需要的类型:int,String,boolean等等
使用其他的注入方式,还可以注入为一个类型。这里的使用方式也比较简单
在这里插入图片描述
就是@Value(“{你的配置名称}”),注意一下就好。
然后就可以看到打印成功了
在这里插入图片描述

还有一点需要特别说明一下,就是你的文件配置名称,一定要是application,不能是其他的,不然就会报错

<2>.yml文件配置

首先就是要明白,两个文件可以共存嘛?可以的共存,他们是有一个先后的执行顺序

先是.properties,然后再是.ymi
但是我们不建议两个同时使用,所以这里我们就使用一个就好

1>.properties文件配置和.yml文件配置对比

我先说一下观点,这两个文件你不能说谁好谁坏,谁优谁劣,虽然说.yml写起来很方便,当时有时候你用起来就没那么爽了,所以这里提一下yml改进的地方
1、写法简单
2、支持多种数据类型
3、支持跨语言
上述这三个优点,都是 properties 配置文件所不具备的。

2>格式

这里是引用
注意我上面的这种格式
yml 是树形结构的配置⽂件,它的基础语法是“key: value”,注意 key 和 value 之间使⽤英⽂冒号加空格的⽅式组成的,其中的空格不可省略。
在这里插入图片描述
那我们就给他加一个呗,注意一定要有空格哈
在这里插入图片描述
之后就可以打印成功了

四丶关于Spring Boot日志文件

日志是程序的重要组成部分,想象一下,如果程序报错了,不让你打开控制台看日志,那么你能找到报 错的原因吗?
答案是否定的,写程序不是买彩票,不能完全靠猜,因此日志对于我们来说,最主要的用途就是排除和 定位问题。
除了发现和定位问题之外,我们还可以通过日志实现以下功能:
1.记录用户登录日志,方便分析用户是正常登录还是恶意破解用户。
2.记录系统的操作日志,方便数据恢复和定位操作人。
3.记录程序的执行时间,方便为以后优化程序提供数据支持。
以上这些都是日志提供的非常实用的功能。

我们其实在启动SpringBoot项目的时候就默认有日志输出
在这里插入图片描述
通过上述日志信息我们能发现以下 3 个问题:

<1>Spring Boot 内置了日志框架(不然也输出不了日志)。
<2>默认情况下,输出的日志并非是开发者定义和打印的,那开发者怎么在程序中自定义打印日志呢?
<3> 日志默认是打印在控制台上的,而控制台的日志是不能被保存的,那么怎么把日志永久的保存下来 呢?

<1>日志打印级别

首先我们了解一下日志的打印级别,这个还是挺重要的
在这里插入图片描述
然后此时我们给当前包的日志权限设置一下它的级别
在这里插入图片描述
然后在当前的类中定义一个Logger这样的对象用来打印日志
在这里插入图片描述
它的权限和你给的包路径的权限是一致的,然后我们可以看到打印成功
在这里插入图片描述

2>注解@Slf4j的使用

但是这里很麻烦不是嘛?我每个包都有自己的权限,然后每在一个包中进行日志的打印,就要重新写一个log对象?,所以这里我们用这个更为简便的写法
在这里插入图片描述
然后可以看到打印成功
在这里插入图片描述

你这里使用这个注解,那么就会有一个默认的属性log,效果其实和我们上面的那种效果是一样的。

总结

这篇博客对于Spring没有进入太深入的了解,更多的就是基本的使用,还有对于Bean的声明周期作用域以及其他的一些拓展。就当面试题背吧

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值