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的一个脚手架

相关推荐
聪明的笨猪猪16 分钟前
实际工程问题:AI生成Redis分布式锁的原子性缺陷导致库存超卖
java·经验分享·面试·ai编程
终码一生18 分钟前
开源项目|一款强大的桌面远程控制软件
后端·开源
软件技术NINI1 小时前
基于SpringBoot和Vue的新能源汽车销售推荐系统
java·vue.js·spring boot·后端·汽车·毕业设计·毕设
GISer_Jing1 小时前
Agent相关岗位时收集的各类技术面试题
后端·ai·langchain
量化分析码农1 小时前
【Python量化波动率实战 06】一键输出风险看板:波动率仪表盘工程化
后端
Flynn Liang1 小时前
LangChain4j 生产级工程骨架:12 个模块 + Docker 一键启动
java·spring boot·langchain·rag·langchain4j
噢,我明白了3 小时前
JAVA中的一些基础应用知识点
java·开发语言
花间相见3 小时前
【计算基础|Redis02】【上手】五大数据类型命令逐条实操
数据库·redis·后端
GISer_Jing3 小时前
AI Agent秋招面试万字通关指南|架构、ReAct、上下文工程、RAG、评测、生产运维全解
后端·ai·langchain
SL_staff3 小时前
私有化低代码不是妥协,而是企业级数字化的自主可控主航道
java