当前位置: 首页 > article >正文

简单介绍 Spring 中获取 Bean 的三种方式

文章目录

      • 一、自动注入方式
      • 二、从 ApplicationContext 手动获取 Bean
      • 三、使用 BeanFactory 获取 Bean
      • 四、总结
      • 推荐阅读文章

在 Spring 应用中,Bean 是项目的核心。无论是通过自动注入、依赖注入还是手动获取 Bean,了解获取 Bean 的多种方式能够帮助我们更灵活地操控 Spring 容器中的对象。今天,我们将深入探索 Spring 中获取 Bean 的几种常用方式。

一、自动注入方式

  1. @Autowired 注解
    最常用的获取 Bean 的方式之一,@Autowired 注解会自动根据类型将需要的 Bean 注入到属性、构造方法或 setter 方法中。

    @Autowired
    private MyService myService;
    
  2. @Resource 注解
    @Resource 是 JSR-250 提供的注解。它优先按名称装配 Bean,找不到时会按类型注入。与 @Autowired 类似,但适用于标准 Java EE 环境。

    @Resource(name = "myService")
    private MyService myService;
    
  3. @Inject 注解
    @Inject 是 Java CDI(Contexts and Dependency Injection)提供的注解,与 @Autowired 类似,但它没有 required 属性。

    @Inject
    private MyService myService;
    

二、从 ApplicationContext 手动获取 Bean

除了依赖注入外,我们还可以直接从 Spring 容器中获取 Bean,这在某些动态场景中尤其方便。

  1. 通过 Class 类型获取 Bean
    这是最简单的一种方式,通过 ApplicationContext.getBean(Class<T> requiredType) 获取 Bean。适合 Bean 唯一的情况。

    MyService myService = applicationContext.getBean(MyService.class);
    
  2. 通过名称获取 Bean
    通过 Bean 名称直接获取,可以与 Class 类型配合使用。在同类型 Bean 存在多个实现时非常有用。

    MyService myService = (MyService) applicationContext.getBean("myService");
    
  3. 通过名称和类型获取 Bean
    同时指定名称和类型获取 Bean,确保类型安全,避免类型转换。

    MyService myService = applicationContext.getBean("myService", MyService.class);
    

三、使用 BeanFactory 获取 Bean

ApplicationContextBeanFactory 的扩展接口,具有更多功能。若需要轻量获取 Bean,可以直接使用 BeanFactory

BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
MyService myService = factory.getBean(MyService.class);

四、总结

了解这些获取 Bean 的方式后,选择适合的获取方法可以大大提高代码的灵活性与可维护性。从依赖注入到手动获取 Bean,各种方式都有它们的使用场景。希望这些技巧能帮助你在 Spring 项目中更加游刃有余!

推荐阅读文章

  • 由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)
  • 如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系
  • HTTP、HTTPS、Cookie 和 Session 之间的关系
  • 什么是 Cookie?简单介绍与使用方法
  • 什么是 Session?如何应用?
  • 使用 Spring 框架构建 MVC 应用程序:初学者教程
  • 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误
  • 如何理解应用 Java 多线程与并发编程?
  • 把握Java泛型的艺术:协变、逆变与不可变性一网打尽
  • Java Spring 中常用的 @PostConstruct 注解使用总结
  • 如何理解线程安全这个概念?
  • 理解 Java 桥接方法
  • Spring 整合嵌入式 Tomcat 容器
  • Tomcat 如何加载 SpringMVC 组件
  • “在什么情况下类需要实现 Serializable,什么情况下又不需要(一)?”
  • “避免序列化灾难:掌握实现 Serializable 的真相!(二)”
  • 如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)
  • 解密 Redis:如何通过 IO 多路复用征服高并发挑战!
  • 线程 vs 虚拟线程:深入理解及区别
  • 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
  • 10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!
  • “打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!”
  • Java 中消除 If-else 技巧总结
  • 线程池的核心参数配置(仅供参考)
  • 【人工智能】聊聊Transformer,深度学习的一股清流(13)
  • Java 枚举的几个常用技巧,你可以试着用用

http://www.kler.cn/a/388876.html

相关文章:

  • Redis - 集群(Cluster)
  • Vue 3 介绍及应用
  • Unity3D学习FPS游戏(12)敌人检测和攻击玩家
  • Scala入门基础(17.1)Set集习题
  • Blender进阶:图像纹理节点和映射节点
  • 实时渲染技术如何助力3D虚拟展厅?
  • 如何防止苹果MacOS进入休眠状态
  • 【Unity】ScriptableObject的应用和3D物体跟随鼠标移动:鼠标放置物体在场景中
  • 报错 - ‘jax.core‘ has no attribute ‘NamedShape‘
  • C语言 | Leetcode C语言题解之第546题移除盒子
  • 利用 Avalonia UI 构建 Blazor 混合应用程序
  • sql分区
  • 计算机体系结构之多级缓存、缓存miss及缓存hit(二)
  • 【LeetCode】分发糖果 解题报告
  • O-RAN简介
  • 【数学二】线性代数-线性方程组-齐次线性方程组、非齐次线性方程组
  • python的学习
  • 深度学习-神经网络基础-网络搭建-损失函数-网络优化-正则化方法
  • Ubuntu 20.04安装ROS noetic
  • 产品经理晋级-Axure中继器制作美观表格
  • 线上问题的排查之内存溢出(OOM)问题如何排查
  • 09 Oracle数据拯救:Flashback Technologies精细级数据恢复指南
  • Spring Boot 3中基于纯MyBatis的CURD开发实例
  • 嵌入式采集网关(golang版本)
  • CSS的综合应用例子(网页制作)
  • vue系列=状态管理=Pinia使用