当前位置: 首页 > news >正文

Spring IOC与DI核心解析

Spring IOC(控制反转)

我们将一些任务(比如创建对象)交给了spring来进行集中管理,而这些任务本来是由我们来做的,所以控制权反转了。

Spring DI(注入)

我们将IOC中的一些依赖对象注入到当前对象

那讲了这么多怎么用呢?

这就需要了解到Bean的存储

其实我们将任务放入IOC容器的这一操作,也可以叫做Bean存储

两类注解可以实现:

1.类注解

@Controller @Service @Respository @Component @Configuration

2.方法注解

@Bean

我们没法直观的看到IOC容器是否有这个对象
可以通过一些方法来获得这个对象来测试

UserController类(注意我们是加了注解的)

我们的重点在于context,它表示上下文,我们通过getBean方法得到了依赖对象,该方法是通过类来获取的

其他获取方法

通过bean名来查找是如果原来的名字第一个字母是大写,则查找时要转为小写

如果第一个字母和第二个都是大写,则不用转为小写

通过bean名称来获取

通过bean名称和类型来查找

其他的注解不再依次进行举例基本都只是改一个注解就行

为什么要有这么多的注解?

应用分层

当我们查看这些注解的源码就会发现,他们里面都会有一个@Component注解,这就说明其他注解都是@Component注解的衍生类,至于为什么要细分,因为后面的应用类越来越多,不进行划分就会导致修改代码的成本很大

方法注解@Bean

类注解是添加到类上的,但有的时候,我们并不需要一个类,而是需要一个已经设计好的对象或者其他的,这时候我们就需要用到方法注解了。

如果只是进行文字讲解对该概念并不会有一定的理解,还需要着重的看下用法

我们发现我们费劲巴拉的一顿操作却报错了,这里显示的是该类型的bean不只有一个,不能通过类去进行匹配,所以我们得用bean名进行匹配,我们细心看我们写的Bean注解就会发现,后面我加了几个参数,相当于改了它的名字,这样不就好找了嘛。

不知道各位有没有想过一个问题,启动类也就是 SpringiocApplication 它是怎么扫描到我的这些类的,实践是找到答案的不二之选

我将启动类放在setvice包中了,我们发现spring不认识我们的u1了,很显然没有扫描到,当我们把它放到com.包的时候没有这种情况,我是不是可以认为它的扫描路径是启动类当前所在的包中,显然查看源码后确实如此,由于只是了解,所以便没有必要真的去解析一下源码。

DI详解(重点)

属性注入有三种方式

我们创建了UserService类

1.属性注入

我们通过@Autowired注解方法将其注入

测试一下

2.构造方法注入

注意我们打印的时机,这是构造方法的一个优点,这在后面会说到

3.Setter方法注入

三种方法的优缺点

1.属性注入

优点:简洁,方便

缺点:

1.不能注入一个Final修饰的属性

2.只能用于IOC容器

2.构造方法注入

优点:

1.可以注入Final修饰的属性

2.注入的对象不能改变

3.依赖对象在使用之前一定会完全初始化,因为依赖是在类的构造方法中执行的,而构造方法是早在类加载阶段就要执行的

缺点:当注入的对象多时,代码会很繁琐

3.Setter方法注入

优点:

方便在类实例之后,重新对类进行配置或者注入

缺点:

1.注入的对象可能被改变,因为多次调用Setter方法就有可能有被修改的风险

2.不能注入一个Final修饰的属性

Autowired 存在的问题

我们创建了BeanConfig类

这是因为注入时发现有两个一样类型的Bean才报错的,跟之前的通过类型找Bean是一样的。

我们只需要通过名字来找。

我们现在有三种方法

1.Primary

默认获取到的Bean应该是这个

2.Quality

通过Bean名去查找

3.Resource

通过Bean名去查找

Autowired 与 Resource 的区别

1.Autowired 是属于Spring 的注解,而Resource是JDK提供的注解

2.Autowired是根据类型查找,而Resource是根据名称去查找的,因此相比于Autowired,Resource 可以进行更多的类型设置,比如名称设置

Spring, Spring Boot和SpringMVC的关系以及区别

Spring: 简单来说,Spring是⼀个开发应⽤框架, 是一个 轻量级、⼀ 站式、模块化的框架,其⽬的是⽤于简化企业级应⽤程序开发。

Spring MVC:SpringMVC是Spring的⼀个⼦框架,主要⽤于开发WEB应⽤和⽹络接⼝

Spring Boot: Spring Boot是对Spring的⼀个封装,为了简化Spring应⽤的开发⽽出现的

SpringMVC和SpringBoot都属于Spring,SpringMVC是基于Spring的⼀个 MVC框架,⽽SpringBoot是基于Spring的⼀套快速开发整合包

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      

http://www.dtcms.com/a/515730.html

相关文章:

  • 百度网站优化 件阿里云可以做网站
  • [人工智能-大模型-45]:模型层技术 - 大模型的种类、比较、发展趋势
  • Electron 实战|Vue 桌面端开发从入门到上线
  • 【北京迅为】iTOP-4412精英版使用手册-第五十二章 注册字符类设备
  • 计算机组成原理实验
  • ChatGPT 技术解析与应用:从原理到实践的全景视角
  • 2026版基于python的协同过滤音乐推荐系统
  • 塔防游戏Python开发核心状态与算法实现:植物大战僵尸类游戏技术解析
  • python+vue共享自习室预约系统设计(源码+文档+调试+基础修改+答疑)
  • 漳州网站建设到博大赞wordpress文章不显示自定义字段
  • 新企业如何在国税网站上做套餐wordpress 安装 乱码
  • 函数装饰器
  • 正则表达式入门到精通教程(Linux实操版)
  • 逆向开发在逆向加密狗中的作用
  • 网站模板 古典大学生app开发创业计划书
  • Linux 信号控制
  • Android Studio模拟器无法联网(能打开IP网页,但不能打开域名,DNS解析错误)问题2025年10月22日
  • php如何做局域网的网站网站设计与网页制作代码大全
  • 在没有网络的环境下安装包pymysql
  • Gradle 构建脚本迁移:从 Groovy DSL 到 Kotlin DSL,语法与技巧对比
  • 个人网站审批怎么制作ppt模板 教程
  • 内网构建https
  • [运维]宝塔 Apache环境使用CDN获取访客真实IP方法
  • 【学习系列】SAP RAP 17:RAP应用部署集成至Fiori Launchpad 【S4HC Public Edition】
  • 正点原子RK3568学习日志15-杂项设备驱动
  • 绍兴建设开发有限公司网站网站网站娱乐建设
  • 迭代器失效问题
  • Ubuntu 16.04交叉编译arm-linux-gnueabihf的QT5.6.2
  • 神经网络详解
  • 网站如何防止黑客攻击宁波新闻