Spring笔记【JavaEE】

news2024/11/15 19:32:21

在这里插入图片描述

Spring 核⼼

Spring 是包含了众多⼯具⽅法的 IoC 容器。

什么是容器

我们之前 接触的容器有哪些?

  • List/Map-> 数据存储容器
  • Tomcat->Web容器

什么是Ioc

IoC = Inversion of Control 翻译成中⽂是“控制反转”的意思,也就是说 Spring 是⼀个“控制反转”的容

Ioc优点

实现代码的解耦

对象(Bean)生命周期交给Ioc框架来维护,程序员无需关注。

Spring Ioc容器最核心的功能

  1. 将Bean(对象)储到Spring容器中
  2. 将Bean(对象)从Spring容器中出来

DI

DI 是 Dependency Injection 的缩写,翻译成中⽂是“依赖注⼊”的意思。

Ioc和DI有什么区别?

  • Ioc是一种思想
  • DI是一种实现

等同于 乐观锁【思想】 CAS【实现手段】

Spring创建与使用

1.创建Spring项目

  • Maven项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fVndXQPj-1674091664403)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1669636523133.png)]

  • 添加spring框架支持

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KhrJBtas-1674091664405)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1669636546163.png)]

  • 创建一个启动类并添加 main

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZhnMwr0O-1674091664405)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1669636578338.png)]

2.将对象存储到Spring中

  • 如果是第一次添加,先在spring项目中添加配置文件,非第一次此步骤省略

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i4uJe1NF-1674091664406)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1669636610690.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7EQYLnKc-1674091664406)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1669636831764.png)]

  • 先创建一个bean对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kur53r7A-1674091664407)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1669637065873.png)]

  • 在配置文件中将需要保持到Spring中的bean对象进行注册

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OD9OZoLB-1674091664408)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1669637256032.png)]

3.从Spring中取出对象【读取】

  • 先得到Spring上下文对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zFrr6k5N-1674091664409)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1669637666419.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uEuoC2LJ-1674091664410)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1669637679061.png)]
保持一致

  • 再通过上下文对象提供的方法获取咱们自己需要使用的bean对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QOIe4ZQ7-1674091664410)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1669637756061.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a15JYxcW-1674091664411)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1669637785829.png)]
在这里插入图片描述
在这里插入图片描述

  • 使用bean对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lBHjfQGv-1674091664411)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1669637874628.png)]

ApplicationContext VS BeanFactory

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sG2cHY10-1674091664412)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1669638268398.png)]

经典面试:ApplicationContext 和 BeanFactory 有什么区别?

  • 相同点:都可以实现从容器中获取bean,都提供了getBean的方法。
  • 不同点:
    • ApplicationContext 属于 BeanFactory 的子类。BeanFactory 只提供了基础访问Bean的方法,而ApplicationContext 除了拥有BeanFactory 的所有功能之外,还提供了更多的方法实现,比如对国际化的支持、资源访问的支持、以及事件和传播等方面的支持。
    • 从性能方面来说二者是不一样的,BeanFactory 是按需加载Bean,ApplicationContext 是饿汉式,在创建时会将所有的Bean都加载起来,以备以后使用。

> [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cc3bZQT8-1674091664412)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1669639060378.png)]
在这里插入图片描述

获取Bean的方法

  1. 使用bean name 获取 bean[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cni9CyPw-1674091664413)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1669639773232.png)]

  2. 根据 bean type 获取 bean[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pqOfg4NF-1674091664413)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1669639844897.png)]

写法简单,但是容易出问题。当同一个类型被注入到spring中多次的时候,就会报错。
3. 根据 bean name 和类型获取 bean [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hEKKXrkt-1674091664414)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1669639872897.png)]
健壮性好,推荐使用!

Spring更简单的读取和存储对象

注解

1.存储bean对象

2.读取bean对象(对象装配)

  • 属性注入

  • 构造方法注入【推荐】

  • Setter注入

注⼊的关键字有:
@Autowired

@Resource

  • @Autowired 和 @Resource 区别:
    • 出身不同;
    • 使⽤时设置参数不同 @Resource ⽀持更多的参数,⽐如 name。
  • 解决同⼀类型多个 Bean 的报错:
    a. 使⽤ @Resource(name=“”)
    b. 使⽤ @Qualifier(“”)

三种注⼊优缺点分析

  • 属性注⼊的优点是简洁,使⽤⽅便;缺点是只能⽤于 IoC 容器,如果是⾮ IoC 容器不可⽤,并且只有在使⽤的时候才会出现 NPE(空指针异常)。
  • 构造⽅法注⼊是 Spring 推荐的注⼊⽅式,它的缺点是如果有多个注⼊会显得⽐较臃肿,但出现这种情况你应该考虑⼀下当前类是否符合程序的单⼀职责的设计模式了,它的优点是通⽤性,在使⽤之前⼀定能把保证注⼊的类不为空。
  • Setter ⽅式是 Spring 前期版本推荐的注⼊⽅式,但通⽤性不如构造⽅法,所有 Spring 现版本已经推荐使⽤构造⽅法注⼊的⽅式来进⾏类注⼊了 。

Bean的6种作用域

Bean的作用域:bean在spring整个框架中的某种行为(单例模式)。

  1. singleton:单例作⽤域(默认)
  2. prototype:原型作⽤域(多例模式) -每次对该作⽤域下的Bean的请求都会创建新的实例
  3. request:请求作⽤域(Spring MVC)-每次http请求会创建新的Bean实例
  4. session:会话作⽤域(Spring MVC)-在⼀个http session中,定义⼀个Bean实例
  5. application:全局作⽤域(Spring MVC)-在⼀个http servlet Context中,定义⼀个Bean实例
  6. websocket:HTTP WebSocket 作⽤域 (Spring WebSocket)

单例作用域(singleton) VS 全局作用域(application)

  • singleton是Spring Core 的作用域;application是Spring Web中的作用域
  • singleton作用与Ioc容器,而application作用于Servlet容器

设置Bean的作用域

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-McfSKNRH-1674091664417)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1669692991606.png)]

Bean的生命周期

  1. 实例化Bean(给Bean分配内存空间)
  2. 设置属性(对象注入)
  3. Bean初始化
    • 执行各种通知(执行各种Aware)
    • 执行初始化的前置方法
    • 执行构造方法,两种执行方式,一种是执行 @PostConstruct,另一种是执行 init-method
  4. 使用Bean
  5. 销毁Bean
    • @PreDestroy
    • 重写DisposableBean 接⼝⽅法
    • destroy-method

为什么要先设置属性在进⾏初始化呢 ?

  • 在初始化前如果没有设置属性的话,那么就可能会造成空指针。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/171584.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第三方控价公司,怎么选才靠谱

第三方控价公司,可以帮我们解决渠道问题,分析管理经销队伍,为我们提供宝贵的商业情报。但是市场上第三方控价公司不止一家,随便一搜,就出来一串,业务与服务方面难免良莠不齐。如何从中挑选合格的服务商&…

【甄选靶场】Vulnhub百个项目渗透——项目五十三:Inclusiveness(更改ua,lfi->rce)

Vulnhub百个项目渗透 Vulnhub百个项目渗透——项目五十三:Inclusiveness(更改ua,lfi->rce) 🔥系列专栏:Vulnhub百个项目渗透 🎉欢迎关注🔎点赞👍收藏⭐️留言&#x…

springBoot工程入门

文章目录基本知识快速搭建springBoot工程起步依赖原理分析spring-boot-starter-parentspring-boot-starter-web配置yaml数据格式读取配置profileprofile配置方式多profile文件方式yml多文档方式profile激活方式内部配置加载顺序外部配置加载顺序整合其他框架Junitredismybatiss…

6.Java运算符

文章目录前言一、运算符和表达式二、运算符(1)算术运算符a.数字相加b.字符串相加c.字符相加(2)自增自减运算符应用场景:(3)赋值运算符(4)关系运算符(5)逻辑运算符应用场景:短路逻辑运算符练习(6)三元运算符练习1练习二(7)运算符优先级总结前言 一、运算符和表达式 二、运算符 …

Elasticsearch的Mapping使用分析(es7官方文档解读)

目录mapping是什么动态mapping默认动态mapping设计自己的mapping检测模板运行时字段dynamic参考ES 7版本官方文档 官方7.17文档 挑了一些我觉得重要的点总结 如有谬误,欢迎指正 mapping是什么 在ES里创建一个索引 PUT demo_index {"mappings": {"…

三十二、Kubernetes中Service详解、实例第二篇

1、概述 在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问。 为了解决这个问题,kubernetes提供了Service资源&…

HTML常见转义字符

HTML中常见的转义字符 其他一些常用的字符实体: 链接 http://www.w3chtml.com/html/character.html

PID优化系列之给定值斜坡函数(PLC完整代码+Simulink仿真测试)

很多变频器里的工艺PID,都有"PID给定值变化时间"这个参数,这里的给定值变化时间我们可以利用斜坡函数实现,当然也可以利用PT1 低通滤波器对给定值进行平滑。给定值缓慢变化在很多闭环控制系统里很重要,比如收放卷在初始建张阶段目标值不建议突变容易将卷材拉断(…

初识 Django(Python WEB 框架)

初识 Django(Python WEB 框架)参考描述优劣 Django(部分)优势功能完备,开箱即用开发效率高Admin 管理后台安全ORM可扩展劣势性能模板过渡封装获取长期支持版(Long Time Support,LTS)…

基于Java+SpringBoot+Vue企业资源规划系统设计与实现

博主介绍:✌全网粉丝3W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战✌ 博主作品:《微服务实战》专栏是本人的实战经验总结,《Spring家族及…

开源项目介绍

文章目录简介经验casdoorkeycloaklatexopenMP简介 不经常见的开源项目,第一次接触。 经验 如果是已经开源的软件,使用起来非常的平稳,问题也少。原因是已经经过了多年的历练,已经稳当下来,该发现的问题已经解决的差…

unplugin-vue-components 不能识别组件的自动导入的类型 (pnpm)

引言 unplugin-vue-components 是一款能帮助组件自动导入的库&#xff0c;简单点的说&#xff0c;你不需要使用import xx from xxx.vue 这行语句也能实现导入的效果。 <script setup lang"ts"> import ScreenAdpter from compontents/ScreenAdpter/index.vue i…

[前端笔记——多媒体与嵌入] 6.HTML 中的图片+视频+音频内容

[前端笔记——HTML介绍] 6.HTML 中的图片1.HTML中的图片1.1怎样将一幅图片放到网页上&#xff1f;1.2备选文本1.3宽度和高度1.4.Image titles 图片标题1.5通过为图片搭配说明文字的方式来解说图片1.6CSS背景图片2.视频和音频内容2.1Web中的视频和音频2.1.1<video>元素2.1…

在linux中部署SpringBoot+Vue前后端分离应用

最近有任务需求&#xff0c;自己在linux中通过docker虚拟环境的方式部署了SpringBoot和Vue前后端分离的项目&#xff0c;现在做点总结&#xff0c;给需要的小伙伴分享。不足之处多多指正。关于在linux中安装docker&#xff0c;可以查看博主前几篇博客按照步骤进行安装&#xff…

【JUC系列】ReentrantLock实现本地锁的源码分析

使用场景 public class ReentrantLockTest {private static ReentrantLock lock new ReentrantLock();public static void main(String[] args) {new Thread(()->{lock.lock();// do somethingSystem.out.println("111");try {Thread.sleep(Integer.MAX_VALUE);…

[ 华为云 ] 云计算中Region、VPC、AZ 是什么,他们又是什么关系,应该如何抉择

前几天看到一个问答帖&#xff0c;我回答完了才发现这个帖子居然是去年的也没人回复&#xff0c;其中他问了一些华为云的问题&#xff0c;对于其中的一些概念&#xff0c;这里来总结讲解一下&#xff0c;希望对学习华为云的小伙伴有所帮助。 文章目录区域&#xff08;Region&am…

致 Tapdata 开源贡献者:聊聊 2022 年的进展和新一年的共建计划

岁末年初&#xff0c;在开源领域刚埋下一颗生机勃勃的种子的 Tapdata&#xff0c;想和正在关注我们的开发者&#xff0c;聊聊这一年的进展和新一年的共建计划。 2022年4月&#xff0c;Tapdata 宣布开源 PDK&#xff08;Plugin Development Kit&#xff09;&#xff0c;将自身的…

前端js实现文件多次添加累加上传和选择删除(django+js)- 添加累加文件上传 (一)

前言 原本的多文件上传功能在选择文件时&#xff0c;只能通过同一范围的鼠标框选或者ctrl/shift多选取选择文件&#xff0c;这样选择文件很不灵活&#xff0c;而且在确定之后如果漏选了文件&#xff0c;再次点击上传按钮时会清空表单里的文件信息&#xff0c;只能重复之前的操…

数据库mysql调优

问题描述: mysql dba在mysql服务端启用了连接在空闲一定时间 (10分钟) 后&#xff0c;就自动关闭连接(连接失效)的功能&#xff0c;导致java端连接池在空闲一段时间后&#xff0c;连接被自动关闭(自动失效)。为了避免这种情况出现&#xff0c;可以在dbcp上配置空闲的时候检测连…

PCI、PCI-X、PCI-E、PCI-E Card、Mini PCI-E、M.2、Add-in Card 它们有啥区别?这些概念你搞清楚了吗?

搞硬件或通信的“攻城狮”们&#xff0c;免不了要和各种通信协议及接口打交道。比如&#xff0c;我们经常接触PCI、PCI-X、PCI-E、PCI-E Card、Mini PCI-E、M.2(NGFF)、Add-in Card这些概念&#xff0c;作为“攻城狮”队伍中的一员&#xff0c;你搞清楚它们之间的关系了吗&…