Spring笔记【JavaEE】

导读:本篇文章讲解 Spring笔记【JavaEE】,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

在这里插入图片描述

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对象

  • 使用 5 大类注解实现

    @Controller【控制器】(控制层-前端参数校验)

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

    @Service【服务】(服务层-数据的组装和接口调用)

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

    @Repoistory【仓库】(数据持久层-负责和数据库进行交互)

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

    @Configuration【配置】(配置层)

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

    @Component【组件】

    ![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T01nrDP5-1674091664416)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1669643041612.png)](https://img-blog.csdnimg.cn/506fed1bc9914b1e88ff296935acf693.png)

  • ·提供@Bean方法实现

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/119506.html

(0)

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!