Spring更简单的实现Bean对象的存取(利用注解储存和注入Bean对象)(下)

简介: Spring更简单的实现Bean对象的存取(利用注解储存和注入Bean对象)(下)

三、获取Bean对象

获取 bean 对象也叫做 对象装配,是把对象取出来放到某个类中,有时候也叫 对象注⼊


对象注入,其实就是我们spring中的DI——依赖注入。


IoC 和 DI 是 Spring 中最重要的两个概念,其中 IoC(Inversion of Control)为控制反转的思想,而 DI(Dependency Injection)依赖注入为其(IoC)具体实现。那么 DI 实现依赖注入的方式有几种?这些注入方式又有什么不同?


在 Spring 中通过@Autowired实现依赖注入的常见方式有以下 3 种:

  1. 1.属性注入(Field Injection);
  2. 2.Setter 注入(Setter Injection);
  3. 3.构造方法注入(Constructor Injection)。


属性注入

e76a401e43904068a25da6bd6de4252c.png因此,可以得出结论:

在使用 @Autowired 进行 属性注入的时候

如果 注入的对象,被多次 存入 Spring 中了,那么,光凭 属性的类型是找不到匹配的 bean的!需要将 属性的变量名 改成 BeanName,根据 BeanName 来找寻匹配的对象(bean)并进行 属性注入。


方法不止这一种,但是上述这种 “精确描述 bean 的名称” 的方法,是最简单高效的!

是不是很简单,不用去获取 Spring 的上下文对象 和 getBean 方法,直接通过一个注解,即可获取对应的bean(从Spring中取出 bean)。


再来看一个例子

45eda69678fa46a89b4b37686364d018.png


当同一个类型的 Bean 存在多个时就有可能出现非唯一 Bean 的异常,

 b6c3dec412184fc0bb1ecab5077ab278.png

那么我们怎么解决这个问题呢?

两种办法:

1、把你的属性名给改成类中的方法名student1或者student2


0a25006c20734788890c7230db4f2b13.png

2、用@Qualifier 是用来筛选 Bean

b0371c763379467f888a58a75f5e1c18.png

优缺点

优点:

属性注入最大的优点就是实现简单、使用简单,只需要给变量上添加一个注解(@Autowired),就可以在不 new 对象的情况下,直接获得注入的对象了(这就是 DI 的功能和魅力所在)


缺点:

  1. 1.功能性问题:无法注入一个不可变的对象(final 修饰的对象——无法被初始化);
  2. 2.通用性问题:只能适应于 IoC 容器;
  3. 3.设计原则问题:更容易违背单一设计原则(因为使用方便,在程序中可能大量使用属性注入)。


Setter注入

f7d916ab74e648a2a5a53bd06cfa21fe.png

优缺点分析

从上面代码可以看出,Setter 注入比属性注入要麻烦很多。

优点:

要说 Setter 注入有什么优点的话,那么首当其冲的就是它完全符合单一职责的设计原则,因为每一个 Setter 只针对一个对象。

缺点:

但它的缺点也很明显,它的缺点主要体现在以下 2 点:

1.不能注入不可变对象(final 修饰的对象——无法通过构造方法初始化);

2.注入的对象可被修改(setter方法可多次被调用)


构造方法注入

1ad1c93b8c614ff7b7fc57bf47930b21.png

优缺点分析

优点:

构造方法注入相比于前两种注入方法,它可以注入不可变对象,并且它只会执行一次,也不存在像 Setter 注入那样,被注入的对象随时被修改的情况,它的优点有以下 4 个:

1.可注入不可变对象(在构造方法中就进行了初始化);

2.注入对象不会被修改(一个类中,构造方法只能调用一次);

3.注入对象会被完全初始化;

4.通用性更好(即可以用于IoC容器,也可以用于非IoC容器)。


缺点:

因为在构造方法中可以传多个参数,容易违背单一性原则


经典面试题 :属性注入 ,构造方法注入 和 Setter 注入 之间,有什么区别?

028f095366aa43d494efc072d180243a.png

@Resource VS @Autowired 的区别

@Autowired是spring提供的注解,@Resource是jdk提供的注解

1、用法不同

  • @Autowired,支持 属性注入,构造方法注入,Setter 方法注入。

  • @Resource:支持 属性注入,Setter方法注入。不支持 构造方法注入。


2、@Resource 的 属性注入 比 @Autowired 的 属性注入,使用的更舒服。 因为 @Resource 有很多的属性可以设置;而 @Autowired 只有一个 value 属性。

有很多的属性,即意味着可以使用很多其它的功能。

比如在上面的当同一个类型的 Bean 存在多个时就有可能出现非唯一 Bean 的异常,如果是@Autowired,我们还需要额外的@Qualifier 是用来筛选并 Bean。


而@Resource则可以直接:

dad5f0f69c974dd889924a60fe85a2bb.png


相关文章
|
3月前
|
缓存 监控 Java
SpringBoot @Scheduled 注解详解
使用`@Scheduled`注解实现方法周期性执行,支持固定间隔、延迟或Cron表达式触发,基于Spring Task,适用于日志清理、数据同步等定时任务场景。需启用`@EnableScheduling`,注意线程阻塞与分布式重复问题,推荐结合`@Async`异步处理,提升任务调度效率。
655 128
|
2月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
461 2
|
3月前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
342 12
|
3月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
215 0
探索Spring Boot的@Conditional注解的上下文配置
|
3月前
|
智能设计 Java 测试技术
Spring中最大化@Lazy注解,实现资源高效利用
本文深入探讨了 Spring 框架中的 `@Lazy` 注解,介绍了其在资源管理和性能优化中的作用。通过延迟初始化 Bean,`@Lazy` 可显著提升应用启动速度,合理利用系统资源,并增强对 Bean 生命周期的控制。文章还分析了 `@Lazy` 的工作机制、使用场景、最佳实践以及常见陷阱与解决方案,帮助开发者更高效地构建可扩展、高性能的 Spring 应用程序。
170 0
Spring中最大化@Lazy注解,实现资源高效利用
|
Java 开发者 Spring
解析Spring中Bean的生命周期
解析Spring中Bean的生命周期
266 2
|
XML druid Java
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
207 0
|
Java 开发者 Spring
Spring bean的生命周期详解!
本文详细解析Spring Bean的生命周期及其核心概念,并深入源码分析。Spring Bean是Spring框架的核心,由容器管理其生命周期。从实例化到销毁,共经历十个阶段,包括属性赋值、接口回调、初始化及销毁等。通过剖析`BeanFactory`、`ApplicationContext`等关键接口与类,帮助你深入了解Spring Bean的管理机制。希望本文能助你更好地掌握Spring Bean生命周期。
1105 1
|
Java 开发者 Spring
Spring bean的生命周期详解!
本文详细介绍了Spring框架中的核心概念——Spring Bean的生命周期,包括实例化、属性赋值、接口回调、初始化、使用及销毁等10个阶段,并深入剖析了相关源码,如`BeanFactory`、`DefaultListableBeanFactory`和`BeanPostProcessor`等关键类与接口。通过理解这些核心组件,读者可以更好地掌握Spring Bean的管理和控制机制。
1515 1
|
Java Spring 容器
Spring Boot 启动源码解析结合Spring Bean生命周期分析
Spring Boot 启动源码解析结合Spring Bean生命周期分析
463 11