【spring】 IOC

news/2024/5/4 0:22:58/文章来源:https://blog.csdn.net/yzx3105/article/details/127056681

IOC

  • 1 什么是 Spring Bean?
  • 2 将一个类声明为 Bean 的注解有哪些?
  • 3 @Component 和 @Bean 的区别是什么?
  • 4 注入 Bean 的注解有哪些?
    • 4.1 @Autowired 和 @Resource 的区别是什么?
  • 5 Bean 的作用域有哪些?
  • 6 Bean 的生命周期了解么?

IOC(Inverse of Control:控制反转) 是一种设计思想,而不是一个具体的技术实现,IOC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。
IOC 容器是 Spring 用来实现IOC的载体, IoC 容器实际上就是个 Map(key,value),Map 中存放的是各种对象。

1 什么是 Spring Bean?

Bean 代指的就是那些被 IoC 容器所管理的对象。

2 将一个类声明为 Bean 的注解有哪些?

@Component :通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。
@Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。
@Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。
@Controller : 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。

3 @Component 和 @Bean 的区别是什么?

  1. @Component 注解作用于类,而@Bean注解作用于方法。
@Component
public class Student {} 
@Configuration
public class WebSocketConfig {@Beanpublic Student student(){return new Student();}
}
  1. @Component(和@Service和@Repository)用于自动检测和使用类路径扫描自动配置bean。注释类和bean之间存在隐式的一对一映射(即每个类一个bean)。
    这种方法对需要进行逻辑处理的控制非常有限,因为它纯粹是声明性的。
    @Bean用于显式声明单个bean,而不是让Spring像上面那样自动执行它。它将bean的声明与类定义分离,并允许您精确地创建和配置bean。
  2. @Bean 注解比 @Component 注解的自定义性更强,而且很多地方我们只能通过 @Bean 注解来注册 bean。比如当我们引用第三方库中的类需要装配到 Spring容器时,则只能通过 @Bean来实现。

4 注入 Bean 的注解有哪些?

@Autowired
@Resource
@Inject

4.1 @Autowired 和 @Resource 的区别是什么?

举个例子,SmsService 接口有两个实现类: SmsServiceImpl1和 SmsServiceImpl2,且它们都已经被 Spring 容器所管理。

@Autowired 属于 Spring 内置的注解,默认的注入方式为byType(根据类型进行匹配)。
@Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)。

// 报错,byName 和 byType 都无法匹配到 bean
@Autowired
private SmsService smsService;
// 正确注入 SmsServiceImpl1 对象对应的 bean
@Autowired
private SmsService smsServiceImpl1;
// 正确注入  SmsServiceImpl1 对象对应的 bean
// smsServiceImpl1 就是我们上面所说的名称
@Autowired
@Qualifier(value = "smsServiceImpl1")
private SmsService smsService;

@Resource属于 JDK 提供的注解,默认注入方式为 byName。如果无法通过名称匹配到对应的 Bean 的话,注入方式会变为byType。
@Resource 有两个比较重要且日常开发常用的属性:name(名称)、type(类型)。
如果仅指定 name 属性则注入方式为byName,如果仅指定type属性则注入方式为byType,如果同时指定name 和type属性(不建议这么做)则注入方式为byType+byName。

// 报错,byName 和 byType 都无法匹配到 bean
@Resource
private SmsService smsService;
// 正确注入 SmsServiceImpl1 对象对应的 bean
@Resource
private SmsService smsServiceImpl1;
// 正确注入 SmsServiceImpl1 对象对应的 bean(比较推荐这种方式)
@Resource(name = "smsServiceImpl1")
private SmsService smsService;

总结:

  1. @Autowired 是 Spring 提供的注解,@Resource 是 JDK 提供的注解。
  2. @Autowired 默认的注入方式为byType(根据类型进行匹配),@Resource默认注入方式为 byName(根据名称进行匹配)。
  3. 当一个接口存在多个实现类的情况下,@Autowired 和@Resource都需要通过名称才能正确匹配到对应的 Bean。Autowired 可以通过 @Qualifier 注解来显示指定名称,@Resource可以通过 name 属性来显示指定名称。

5 Bean 的作用域有哪些?

singleton : IoC 容器中只有唯一的 bean 实例。Spring 中的 bean 默认都是单例的,是对单例设计模式的应用。
prototype : 每次获取都会创建一个新的 bean 实例。也就是说,连续 getBean() 两次,得到的是不同的 Bean 实例。
request (仅 Web 应用可用): 每一次 HTTP 请求都会产生一个新的 bean(请求 bean),该 bean 仅在当前 HTTP request 内有效。
session (仅 Web 应用可用) : 每一次来自新 session 的 HTTP 请求都会产生一个新的 bean(会话 bean),该 bean 仅在当前 HTTP session 内有效。

6 Bean 的生命周期了解么?

1)bean对象的实例化
2)利用依赖注入完成 Bean 中所有属性值的配置注入。
3)处理Aware接口:
接着,Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给Bean:
①如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的就是Spring配置文件中Bean的id值;
②如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,传递的是Spring工厂自身。
③如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文;
4)如果 BeanPostProcessor 和 Bean 关联,则 Spring 将调用该接口的预初始化方法 postProcessBeforeInitialzation() 对 Bean 进行加工操作,此处非常重要,Spring 的 AOP 就是利用它实现的。
5)如果 Bean 实现了 InitializingBean 接口,则 Spring 将调用 afterPropertiesSet() 方法。
6)如果在配置文件中通过 init-method 属性指定了初始化方法,则调用该初始化方法。
7)如果 BeanPostProcessor 和 Bean 关联,则 Spring 将调用该接口的初始化方法 postProcessAfterInitialization()。此时,Bean 已经可以被应用系统使用了。
8)如果在 中指定了该 Bean 的作用范围为 scope=“singleton”,则将该 Bean 放入 Spring IoC 的缓存池中,将触发 Spring 对该 Bean 的生命周期管理;如果在 中指定了该 Bean 的作用范围为 scope=“prototype”,则将该 Bean 交给调用者,调用者管理该 Bean 的生命周期,Spring 不再管理该 Bean。
9)如果 Bean 实现了 DisposableBean 接口,则 Spring 会调用 destory() 方法将 Spring 中的 Bean 销毁;如果在配置文件中通过 destory-method 属性指定了 Bean 的销毁方法,则 Spring 将调用该方法对 Bean 进行销毁。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx系列之过滤模块以及变量使用

Nginx过滤模块 Nginx的过滤模块是发生在content模块之后,log模块之前,如image_fiter模块,gzip模块就是过滤模块的一部分。过滤模块用于修改返回的响应头和响应的body。如下左图所示,在content阶段生成响应的内容后,执…

Nginx系列之负载均衡算法策略

负载均衡实际上是一种网络技术,主要是基于现有的网络结构,增加吞吐量、加强网络数据处理能力、提高应用系统的灵活和可用性。利用Nginx可实现负载均衡,Nginx支持加权Round-Robin负载均衡算法,即加权轮询方式访问server指令指定的后…

CMSC5724-关于条件概率和朴素贝叶斯分类器

文章目录条件概率公式朴素贝叶斯分类器不同假设下的贝叶斯分类贝叶斯分类器候选集相关题目这节课讲述了另一种和概率有关的分类器,老师也改变了讲课方式,直接摆上例子,然我们通过例子将课件上的内容串联起来,减少了纯粹的理论公式…

行人重识别

一、什么是行人重识别 行人重识别(Person Re-identification也称行人再识别,简称为ReID,是利用计算机视觉技术判断图像或者视频序列中是否存在特定行人的技术;或者说,行人重识别是指在已有的可能来源与非重叠摄像机视域…

Stack Smashing

Stack Smashing 当canary被覆盖后,会call到__stack_chk_fail打印argv[0]这个指针指向的字符串,默认是程序的名字,如果我们把它覆盖为其他的地址时,它就会把其他内存地址的信息给打印出来 Example:wdb2018_guess Analyze Arch: amd64-64-little RELRO: Partial RELRO…

3个超实用功能,华为手机负一屏应该这么用

现在越来越多人使用华为手机,但是你知道华为手机的负一屏吗?华为手机负一屏有哪些功能?华为手机的负一屏有以下3个超实用的功能,以后打开手机,你就可以快速找到自己想查看的东西了! 你可能会问华为手机的负…

C语言刷题(二)

✅作者简介:大家好我是:嵌入式基地,是一名嵌入式工程师,希望一起努力,一起进步! 📃个人主页:嵌入式基地 🔥系列专栏:牛客网C语言刷题专栏 💬推荐一…

保姆级, 使用 KotlinScript 构建 SpringBootStarter

因业务需要, 公司内需要使用 SpringBoot Starter 构建 SDK. 不同的是使用了更为灵活的 Kotlin 语言, 构建脚本也换成了 Kotlin Script. .kts本文主要分几个步骤: 用 Kotlin 写一个简单 SpringBoot Starter 进阶一: 复杂配置参数的写法 进阶二: starter 单元测试 使用 Kotlin …

【计算机组成原理】中央处理器(四)—— 控制器的功能和工作原理

【计算机组成原理】中央处理器(四)—— 控制器的功能和工作原理一、前言二、硬布线控制器(一)、安排微操作时序的原则1. 安排微操作时序-取指周期2. 安排微操作时序-间址周期3. 安排微操作时序-执行周期4. 安排微操作时序-间址周期…

Python算法性能分析-时间复杂度

时间复杂度: 算法的运行时间。 什么是大O: 大O用来表示上界的。 数据规模: 在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模&am…

没有项目经验,如何书写漂亮的简历?

嗨,同学 你们是不是也开始 国庆假期倒计时啦!!! 一想到熬过这周,接下来可以嗨7天7夜 就按捺不住自己内心的雀跃! 但是,有人却高兴不起来,因为在这个“金九银十”,一些同学还没找到…

接口(关注我还有后续哦)

👍 棒棒有言:现在学习Java变得比以前容易多了,除了有大量的视频教程外,还有专业的机构,这都使学习变得更加简单化。如果仅仅学了些皮毛,高手写的程序你是望尘莫及的。在学习的过程中,书籍永远是…

后台系统接入udesk在线客服(vue前端方式)

SDK最舒服的一点就是买来服务,直接Ctrl CV脚本进项目基本就能完成目标功能,要做的无非就是自定义属性的添加。 楼上项目组用的是java后端接入,我这儿是vue前端接入,做法略有不同。 简单点做就是复制上面script标签内代码到index.h…

关于SignalR的内容延续:1.协商协议 2.分布式部署

既然项目中用到了,那就搞搞清楚,搞不懂就死 : > 前置内容: 长轮询问题在ABP中的解决方案,SignalR_董厂长的博客-CSDN博客 “SingalR是对webSocekt的封装” ,这句话是片面的。 因为: SignalR支持多…

vue-----组件通信/传值

一 父子组件通信分为父给子传和子给父传 父给子传: 1.在子组件标签中写传入的值 2.在子组件内使用props接收父组件传递的值。 子给父传: 1.在子组件内部使用$emit发射自定义事件和传递给父组件的值 2.在父组件内声明自定义事件接受参数 二 兄弟组件…

真无线蓝牙耳机哪款音质最好?真无线蓝牙耳机音质排行榜

随着蓝牙技术的飞速发展,很多耳机的质量和质量都很好。喜欢音乐的人,往往会沉迷于这种美妙的感觉,也正是因为如此,他们才会对音质有更高的要求。除了音质之外,还有很多新的特性,例如主动降低噪音、声音操控…

全流程调度

目录 Azkaban 配置mysql 配置 Executor Server 配置Web Server Sqoop导出脚本 Azkaban 安装azkaban并改名 配置mysql 启动 [doudouhadoop102 ~]$ mysql -uroot -p123456登陆 MySQL,创建 Azkaban 数据库 mysql> create database azkaban;设置密码有效长度 …

一文入门Qt Quick

很高兴可以来到这一章,终于可以开始讲讲最近几年Qt的热门技术Quick这一块了。希望通过这个比较简短的例子可以带领有兴趣的朋友快速跨过Qt Quick的入门这道槛!以下内容为本人的著作,如需要转载,请声明原文链接 微信公众号「englyf」https://www.cnblogs.com/englyf/p/16733…

m基于matlab的光通信的信道估计,均衡,抑制papr误码率仿真,对比ZF,RLS,MMSE三种算法(包括matlab仿真录像)

目录 1.源码获取方式 2.算法描述 3.部分程序 4.部分仿真图预览 1.源码获取方式 使用版本matlab2013b 获取方式1: 点击下载链接(解压密码C123456): m基于matlab的光通信的信道估计,均衡,抑制papr误码…

libxml编译时问题解决记录

在对libxml进行模糊测试时,需要先将其拉去并进行编译,可参考此链接:magma本地编译 或者直接参考这个链接:magma编译libxml2 然而在编译的过程中,拉去完libxml2执行到这一句时报错如下: configure.ac:42: e…