简单介绍 Spring 中获取 Bean 的三种方式
文章目录
- 一、自动注入方式
- 二、从 ApplicationContext 手动获取 Bean
- 三、使用 BeanFactory 获取 Bean
- 四、总结
- 推荐阅读文章
在 Spring 应用中,Bean 是项目的核心。无论是通过自动注入、依赖注入还是手动获取 Bean,了解获取 Bean 的多种方式能够帮助我们更灵活地操控 Spring 容器中的对象。今天,我们将深入探索 Spring 中获取 Bean 的几种常用方式。
一、自动注入方式
-
@Autowired 注解
最常用的获取 Bean 的方式之一,@Autowired
注解会自动根据类型将需要的 Bean 注入到属性、构造方法或 setter 方法中。@Autowired private MyService myService;
-
@Resource 注解
@Resource
是 JSR-250 提供的注解。它优先按名称装配 Bean,找不到时会按类型注入。与@Autowired
类似,但适用于标准 Java EE 环境。@Resource(name = "myService") private MyService myService;
-
@Inject 注解
@Inject
是 Java CDI(Contexts and Dependency Injection)提供的注解,与@Autowired
类似,但它没有required
属性。@Inject private MyService myService;
二、从 ApplicationContext 手动获取 Bean
除了依赖注入外,我们还可以直接从 Spring 容器中获取 Bean,这在某些动态场景中尤其方便。
-
通过 Class 类型获取 Bean
这是最简单的一种方式,通过ApplicationContext.getBean(Class<T> requiredType)
获取 Bean。适合 Bean 唯一的情况。MyService myService = applicationContext.getBean(MyService.class);
-
通过名称获取 Bean
通过 Bean 名称直接获取,可以与Class
类型配合使用。在同类型 Bean 存在多个实现时非常有用。MyService myService = (MyService) applicationContext.getBean("myService");
-
通过名称和类型获取 Bean
同时指定名称和类型获取 Bean,确保类型安全,避免类型转换。MyService myService = applicationContext.getBean("myService", MyService.class);
三、使用 BeanFactory 获取 Bean
ApplicationContext
是 BeanFactory
的扩展接口,具有更多功能。若需要轻量获取 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 枚举的几个常用技巧,你可以试着用用