Spring的存储与获取Bean(下)

简介: Spring的存储与获取Bean(下)

类注解之间的关系


@Component 是 @Controller, @Service, @Repository, @Configuration 的父类

利用方法注解进行存储


方法注解需搭配类注解一同使用

(目的是为了提高效率)

新建一个 Student 类

新建一个 StudentBeans 类

为 getStu() 添加方法注解(@Bean)

为 StudentBeans 添加类注解(@Component)

关于Id


  • 默认情况下 getBean() 对应的 Id 为方法名
  • @Bean 后可以跟 name
  • (例如 @Bean(name = {"s1", "s2"}))
  • 当 @Bean 后添加了 name 时, 所对应的 Id 只能为 name 名, 不允许设置为方法名

默认情况下 getBean() 对应的 Id 为方法名

@Bean 后可以跟 name

🔎Spring—获取Bean


从 Spring 中获取 Bean 也称为对象装配, 对象注入

对象装配(对象注入)的方式可以划分为 3 种

  • 属性注入
  • Set 注入
  • 构造方法注入

属性注入


属性注入的效果等同于赋值

举个栗子🌰

@Autowired
private StudentService studentService;
private int num = 10;

StudentService studentService利用属性注入, 由 Spring 框架赋值

int num未利用属性注入, 由程序员赋值

综上, 再次说明了 Spring 是一个包含众多工具方法的 IOC 容器

(IOC → 控制反转)

属性注入的优点🍂

  • 实现简单

属性注入的缺点🍂

  • 不能注入不可变对象(final 修饰)
  • 只适用于 IOC 容器
  • 更容易违背单一设计原则

不能注入不可变对象(final 修饰)

final 修饰的对象有 2 种赋值方式

  1. 直接赋值
  2. 在构造方法中赋值

只适用于 IOC 容器

@Autowired 来自于 Spring

Spring 是一个包含众多工具方法的 IOC 容器

因此只适用于 IOC 容器

更容易违背单一设计原则

属性注入的方式实现简单

因此也更容易将其他无关的对象一并注入

也就更容易违背单一设计原则

Set注入


Set 注入的优点🍂

  • 更符合单一设计原则

Set 注入的缺点🍂

  • 不能注入不可变对象(final 修饰)
  • 注入的对象可被修改

更符合单一设计原则

Set 注入的实现方式相比于属性注入较复杂

因此相较于属性注入也就避免了将其他无关的对象一并注入的情况

(更符合单一设计原则)

不能注入不可变对象(final 修饰)

final 修饰的对象有 2 种赋值方式

  1. 直接赋值
  2. 在构造方法中赋值

注入的对象可被修改

Set 注入相较于属性注入更危险!

属性注入的对象也可被修改

但 Set 注入除通过属性注入的方式修改注入的对象

也可通过 set() 方法修改注入的对象

set() 方法既可以被 Spring 调用

也可以被其他对象调用

构造方法注入


注意

  1. 当只存在一个构造方法时, @Autowired 可省略
  2. 当存在多个构造方法时, @Autowired 不可省略

构造方法注入的优点🍂

  • 能注入不可变对象(final 修饰)
  • 注入的对象不可被修改
  • final 修饰
  • 构造方法随着类的加载只执行一次
  • 注入的对象会被完全初始化(类加载时就会将对象进行初始化, 当执行其他方法时, 对象已被初始化 → 构造方法的机制)
  • 通用性更好(任何一个类都会有构造方法)

构造方法注入的缺点🍂

  • 实现方式不如属性注入简单

总结(Spring的注入方式? 它们之间的区别?)

@Resource


  • @Resource
  • 可以实现属性注入
  • 可以实现 Set 注入
  • 不可以实现构造方法注入

使用 @Resource 实现属性注入

使用 @Resource 实现 Set 注入

使用 @Resource 不能实现构造方法注入

对比@Resource与@Autowired

来源不同🍭

@Resource

@Autowired

支持参数不同🍭

@Resource

@Autowired

Tips


存在返回同一个类型的多个方法时

利用@Resource(name = "")可以将其进行区分

@Autowired 无法设置 name

只能填写对应的对象

如果想写成 student 形式

需搭配@Qualifier()进行使用, 括号中填写的内容为对应的对象

🔎结尾

创作不易,如果对您有帮助,希望您能点个免费的赞👍

大家有什么不太理解的,可以私信或者评论区留言,一起加油

相关文章
|
14天前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
95 26
|
2月前
|
XML 安全 Java
|
2月前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
|
2月前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
|
2月前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
73 6
|
2月前
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
157 3
|
3月前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
134 4
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
2月前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
50 1
|
4月前
|
XML Java 数据格式
Spring从入门到入土(bean的一些子标签及注解的使用)
本文详细介绍了Spring框架中Bean的创建和使用,包括使用XML配置文件中的标签和注解来创建和管理Bean,以及如何通过构造器、Setter方法和属性注入来配置Bean。
104 9
Spring从入门到入土(bean的一些子标签及注解的使用)
|
4月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。