SpringIoc和Di

目录

🌴Spring五大注解

🌴BeanName

🥝bean定义规则

🌴注解@NoArgsConstructor

🌴注解@AllArgsConstructor

🌴注解@Data

🌴@Bean注解

[🥝Bean Name的重命名](#🥝Bean Name的重命名)

🌴spring启动类的扫描路径

🥝注解@ComponentScan

🌴DI

🥝属性注入

🥝构造方法注入

🥝Setter注入

🌴@Primary注解

🌴@Qualifier注解

🌴@Resource注解

🌴注解总结


我们知道Spring可以当一个容器,那么我们要如何学习这个容器呢?

🌴Spring五大注解

1.@Controller---控制器存储

2.@Service---服务存储

3.@Repository---仓库存储

4.@Component---组件存储--"父亲注解"

5.@Configuration---配置存储

应用分层:控制层Controller,业务逻辑层Service,数据访问层Dao,其对应Spring五大注解的前三个,控制层是与前端进行交互的,业务逻辑层是具体需求的逻辑处理,数据访问层就是调用数据库和访问某些实体类的,这三层层层解耦,层里面又高度内聚,最后呈现:低耦合,高内聚。这是规范,也是我们要值得注意的点。

ApplicationContext应用上下文,里面是Spring可以存储Bean和其他的,

而我们Spring启动类里

上面这个ApplicationContext context可以接收SpringApplication.run(SpringiocDiDemoApplication.class, args);的返回值,返回的context就是可以让我们去获取Bean。

添加@Controller注解把UserController交给Spring管理

最后启动项目,成功打印


🌴BeanName

这都是获取Bean的重载方法,其中有根据类型来获取的,还要根据BeanName来获取的,这个BeanName的名字是通过类名经过定义的规则所变化而来的。

🥝bean定义规则

1.默认 类名小驼峰写法

2.前两位字母都为大写,那么beanName就为类名本身

例如:

ADD--》ADD

Add--》add

AddMath--》addMath

ADDMath--》ADDMath

三种获取bean的写法,第二种按名称来拿,就需要将返回结果强转一下,

第3种,先名称再类型,不需要强转,大家了解一下。


🌴注解@NoArgsConstructor

我们知道,当我们只写了一个有参的构造方法时,那个无参的构造方法就会直接不生成,这时候注解@NoArgsConstructor就其作用了,他会生成一个无参构造方法

🌴注解@AllArgsConstructor

这个注解是生成一个全参的构造方法

🌴注解@Data

需要注意的是,这个注解它生成getter,setter,tostring,equals,hashcode方法,它可以理解为不生成构造方法,虽然它生成final修饰的构造方法,不过没啥用,忽略就行。


🌴@Bean注解

问题:五大注解,它只是把某个对象创建一次,然后交给Spring容器,它不会再次创建同样的对象,这就是我们接下来要解决的问题。

其中UserInfo是对象,我们通过@Bean注解,把它的这个返回值两个类型相同,但其内在的值不同UserInfo对象交给Spring容器管理,

需要注意的是,@Bean注解要配合五大注解来使用,不然会报错,不生效。

运行

然后我们发现,它出错了,提示里说,找到了3个类型相同的对象,然后需要注意的是,后面的名称,竟然是我们的方法名,也就是我们交给Spring管理的对象,的那个bean name变成了方法名,这是@Bean方法注解和五大注解的不同之处

我们把这3个返回值类型为同一个的对象都交给了Spring管理,所以按照类型名去取对象,三个相同你告诉我咋取?这就是问题的根源

然后我们就可以根据bean name和类型去拿

成功拿到了

根据bean name拿取

注意强转!

🥝Bean Name的重命名

结果

写法:Bean({"u1","u2"})


🌴spring启动类的扫描路径

同级关系下,我们的spring项目启动没问题,可是如果我们改成下面这样的关系呢

我们看到启动类和我们写的代码不在同一级目录下,我们试着运行一下,看看会发生啥

报错了,这说明启动类要放在合适的目录下才能运行!

🥝注解@ComponentScan

我们加上这个@ComponentScan注解就好了


🌴DI

🥝属性注入

那个UserInfo对象我们已经交给Spring管理了,然后我们使用@Autowired注解,让Spring来给我们进行相应的类型注入

!我想到一个点,如果我把上面的@Controller注解给去掉呢,反正现在貌似用不着,干脆去掉试试

直接编译都不通过,运行更运行不了

那是为什么呢?Spring到底是怎么执行逻辑的呢?

1.首先,Spring启动

2.扫描所有加了五大注解的类(@Controller,@Service)

3.把这些类创建成对象,放到容器中

4.扫描容器中的对象,发现有@Autowired的属性

5.从容器中找到对应的对象,赋值进去

哦,原来是这样的,我们把@Controller注解给去掉后,它都不在容器中,谈何@Autowired注入呢?

需要注意的是,@Autowired注解,不能对final修饰的变量进行属性注入,我们可以巧妙的用构造方法注入,去给final变量赋值!

🥝构造方法注入

我们spring创建对象后丢进容器中这一步里,创建对象,是不是要调用构造方法,就像我们上面写的,spring把已经创建好的对象UserInfo注入到了UserController对象的构造方法里了,需要注意的是,UserInfo要交给Spring管理,才能注入给UserController的构造方法,且UserController对象也要加上五大注解,交给Spring管理,才会给你构造方法注入。

还有一点就是,如果我们有两个构造方法,我们spring默认是执行那个无参的构造方法,如果在两个构造方法都存在的情况下,想给那个有参的构造方法进行注入,也是要加@Autowired注解,这里我就不演示了,大家有个印象就好了,用到的时候,能知道啥原因就行。

🥝Setter注入

与上面一样的,我们进行是setter方法有参时,也可以通过@Autowired注解进行setter注入!


🌴@Primary注解

这段代码的背景就是默认Bean的注入,@Primary结合@Bean注解,表示当有需要的bean的时候,这个类型的bean优先默认注入。


🌴@Qualifier注解

注解@Qualifier和@Autowired注解表示的是,从spring容器中取出类型相同的对象时,拿bean为

u1的进行注入。需要注意的是,这两个注解需要共同使用,才能发挥效果。


🌴@Resource注解

这个@Resource注解起的作用也是指定bean名称的注入,所以,关键点来了,@Qualifier和@Autowired才能相当于@Resource注解的作用,那么对于懒懒的你,会选择哪个呢?🙃


🌴注解总结

好了,本次的springioc和di就完结了,不过我们来把这五大注解和一些零散的注解给总结一下!

完结

相关推荐
沐雪轻挽萤2 小时前
3. C++17新特性-带初始化的 if 和 switch 语句
开发语言·c++
xianluohuanxiang2 小时前
2026年深度:高精度气象+新能源,从风速误差到收益偏差,行业赋能正在重构电站盈利模型
大数据·开发语言·人工智能·机器学习
lifallen2 小时前
Paimon 与 ForSt 场景选型分析
java·大数据·flink
我登哥MVP2 小时前
【Spring6笔记】 - 12 - 代理模式
java·spring boot·笔记·spring·代理模式·aop
froginwe113 小时前
SQL PRIMARY KEY(主键)
开发语言
2401_885885043 小时前
视频短信接口集成起来复杂吗?API接入说明
开发语言·php·音视频
潇洒畅想3 小时前
1.2 希腊字母速查表 + 公式阅读实战
java·人工智能·python·算法·rust·云计算
Thexhy3 小时前
Java 后端完整成长路线(含项目)
java·开发语言
27669582923 小时前
携程旅行 token1005
java·linux·前端·javascript·携程旅行·token1005·携程酒店