Spring IoC和DI(2)

前文见:Spring IoC&DI(1)-CSDN博客

1.方法注解@bean

在以下情况需要用到方法注解:

1.第三方的类需要交给IoC管理

2.同一个类,需要多个对象(类注解默认这个类是单例模式)

Bean需要搭配类注解使用

1.第三方的类

如果注释掉@Bean,就会报错

2.同一个类,需要多个对象

如果再创建一个实例,再根据类的类型获取getBean就会报错:
解决方法:
1.@Qualifier
2.@Primary
3.按名字getBean

@Bean:方法名就是bean的name

4.给Bean重命名

2.bean的name重命名

1.类注解的重命名

2.方法注解的重命名

或者多个重命名

Bean注解的源代码:

name属性可省略

3.扫描路径

有下列方法注解:

把启动类挪到controller包下:

1.问题:实践可知:把启动类 放在 除了Configuration的包下,其余都会报同样的错误。为什么?

2.Spring的默认扫描路径:

扫描是干啥的?

Spring扫描,就是Spring去指定的包里面,找到了添加注解的类,把他们变成Bean放到IoC容器里。

扫描路径是啥?

扫描路径就是Spring去指定的包下往IoC里添加类 的路径

为啥不扫描整个项目的全部文件?

1.浪费性能。项目里的很多文件(普通实体类、工具类、测试类)都不需要交给Spring管理,如果全项目扫描,Spring要遍历全部的文件、解析注解,项目启动会非常慢。

2.同一类型多个Bean冲突。有可能某个第三方类写了@Component,就会出现NoUniqueBeanDefinitionException异常

默认扫描路径是啥?

启动类所在的包及其全部子包

3.结论

所以就可以解释上述代码为啥只有把启动类放在Configuration包下能正常运行了。因为启动类在

Configuration包下,Spring会扫描这个包及其子包,

所以这两个Bean会被添加进IoC里,后续就可以取出来。

4.修改启动类的扫描路径@ComponentScan("")

4.DI详解

依赖注入是一个过程,指在Io容器在创建Bean时,去提供运行时所依赖的资源

Spring提供了三种属性注入的方式:

1.属性注入:@Autowired

2.构造方法注入

1.只有一个有参构造方法

1.问:这个参数是咋传进来的?

Spring在创建UserController这个Bean时:

Spring看到UserController只有这一个构造方法------》

它去看这个方法需要的参数------》

Spring直接去IoC里找UserService类型的Bean------》

找到之后,自动把这个Bean传进构造方法,赋值给参数userService------》

执行this.userService=userService

2.无参+一个有参

如果加上无参构造方法,就会报错

因为如果有 无参构造方法,默认执行的就是 无参构造方法

解决方法:@Autowired指定执行有参构造方法

3.无无参构造方法,有多个有参构造方法时,直接报错

可以通过@Autowired指定构造方法

3.Setter注入

4.三种注入方式对比

属性注入:不能注入一个被final修饰的属性。必须写@Autowired

构造方法注入:能注入一个被final修饰的属性。Spring4.3之后,只有一个构造方法时,可以不写@Autowired

setter注入:不能注入一个被final修饰的属性。set方法上必须写@Autowired

5.@Autowired存在的问题

当属性添加@Autowired注解后,就会从容器中获取对象,并把对象赋值给userRepository

同一个类型存在多个bean时,使用@Autowired会存在问题

1.使用@Primary注解指定

2.使用@Qualifier注解指定

3.使用@Resource注解指定

6.Spring Framework、Spring家族、Spring Boot、Spring Web MVC

Spring家族包括Spring Boot、Spring Framework等

Spring Framework包括spring-core,spring-beans,spring-aop。IoC、DI也属于Spring Framework

SpringBoot是Spring Framework的一个脚手架

相关推荐
Shaoshing1 小时前
高可用与核心概念
java·mq
梦想很大很大1 小时前
重新思考 Workrun:AI 时代,我们还需要手动编排 Workflow 吗?
前端·人工智能·后端
2501_933923251 小时前
SpringCloud组件:Nacos服务注册快速入门
后端·spring·spring cloud·nacos
小羊没烦恼!2 小时前
深入浅出SQL Server中的死锁
java·开发语言·前端·数据库·后端·spring·c#
白露与泡影2 小时前
Java 面试八股文及答案整理 | 后端面试高频题(2026)
java·开发语言·面试
\光辉岁月/2 小时前
6.数组工具类
java·数组·数组工具类
柠檬味拥抱2 小时前
基于 YOLO11 的海底垃圾视觉巡检系统:水下 ROV + Streamlit 全流程实战
后端
武子康2 小时前
从预约改期看 Agent 工具粒度:把不变量留在权威服务
人工智能·后端·agent
hai_android2 小时前
Android 设备锁定:Kiosk Mode 实战
android·java·android jetpack