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

Spring Boot获取Bean的三种方式

 ​

博客主页:     南来_北往

系列专栏:Spring Boot实战


引言

在Spring Boot中,Bean是一个由Spring IoC容器管理的对象

Spring Bean是在Spring IoC容器中被实例化、组装和管理的对象,可以视为Spring应用的构建块。它通过提供一套丰富的注解和配置方式,极大地简化了Java应用的开发过程,特别是对于依赖注入和AOP等高级特性的支持,使得代码更加简洁且易于维护。

实战

在Spring Boot中,获取Bean的三种常见方式包括通过BeanFactory获取、实现BeanFactoryAware接口获取和通过ApplicationContext获取。具体介绍如下:

1、通过BeanFactory获取:尽管不推荐使用BeanFactory,但在某些情况下,人们可以通过BeanFactory来获取Bean。这种方式较为传统,适用于基于XML配置的较旧项目。需要注意的是,XmlBeanFactory已经被废弃,因为基于注解的配置已经取代了基于XML的配置。

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.stereotype.Component;@Component
public class MyBeanFactoryAware implements BeanFactoryAware {private BeanFactory beanFactory;@Overridepublic void setBeanFactory(BeanFactory beanFactory) {this.beanFactory = beanFactory;}public void doSomething() {// 使用beanFactory获取BeanMyService myService = (MyService) beanFactory.getBean("myService");myService.doSomething();}
}

在上面的代码中,我们创建了一个名为MyBeanFactoryAware的类,并实现了BeanFactoryAware接口。在setBeanFactory方法中,我们将传入的BeanFactory实例赋值给成员变量beanFactory。然后,我们可以在doSomething方法中使用beanFactory.getBean()方法来获取需要的Bean实例。

需要注意的是,这种方式并不推荐使用,因为现代的Spring Boot应用通常使用基于注解的配置方式,而不是直接操作BeanFactory。此外,从Spring 5开始,BeanFactory已经被废弃,推荐使用ApplicationContext来代替。

2、通过实现BeanFactoryAware接口:在Java配置类中实现BeanFactoryAware接口,该接口提供一个setBeanFactory方法,允许人们在方法内部直接访问BeanFactory,从而获取所需的Bean。这种方法更为现代,并且可以很好地融入Spring的依赖注入机制。

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.stereotype.Component;@Component
public class MyBeanFactoryAware implements BeanFactoryAware {private BeanFactory beanFactory;@Overridepublic void setBeanFactory(BeanFactory beanFactory) {this.beanFactory = beanFactory;}public void doSomething() {// 使用beanFactory获取BeanMyService myService = (MyService) beanFactory.getBean("myService");myService.doSomething();}
}

在上面的代码中,我们创建了一个名为MyBeanFactoryAware的类,并实现了BeanFactoryAware接口。在setBeanFactory方法中,我们将传入的BeanFactory实例赋值给成员变量beanFactory。然后,我们可以在doSomething方法中使用beanFactory.getBean()方法来获取需要的Bean实例。

需要注意的是,这种方式并不推荐使用,因为现代的Spring Boot应用通常使用基于注解的配置方式,而不是直接操作BeanFactory。此外,从Spring 5开始,BeanFactory已经被废弃,推荐使用ApplicationContext来代替。

3、通过ApplicationContext获取:ApplicationContext提供了更全面的框架功能,包括国际化支持和更完善的应用事件体系。在启动类中定义一个静态的ConfigurableApplicationContext变量,通过该变量调用getBean方法即可获得管理的Bean。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;@Component
public class MyApplicationContextAware implements ApplicationContextAware {private ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) {this.applicationContext = applicationContext;}public void doSomething() {// 使用applicationContext获取BeanMyService myService = applicationContext.getBean(MyService.class);myService.doSomething();}
}

在上面的代码中,我们创建了一个名为MyApplicationContextAware的类,并实现了ApplicationContextAware接口。在setApplicationContext方法中,我们将传入的ApplicationContext实例赋值给成员变量applicationContext。然后,我们可以在doSomething方法中使用applicationContext.getBean()方法来获取需要的Bean实例。

需要注意的是,这种方式并不推荐使用,因为现代的Spring Boot应用通常使用基于注解的配置方式,而不是直接操作ApplicationContext。此外,从Spring 5开始,ApplicationContextAware接口已经被废弃,推荐使用@Autowired注解来注入需要的Bean。

总结

这些方式各有优势,选择哪一种取决于具体的应用场景和需求。通过BeanFactory的方式适合轻量级应用和移动设备,而BeanFactoryAware和ApplicationContext则更适合需要完整Spring功能的场合。

相关文章:

  • 全网首发!鸿蒙OS登上PC,冒风险流出内测,系统界面截图,过会儿就删
  • AMD Product Specifications - AMD 产品规格汇总
  • gitee拉取项目,提交代码
  • 力扣493.翻转对
  • RocketMQ5.0课笔记-架构设计
  • 软件设计之HTML5
  • 本地部署MySQL图形化管理工具phpMyAdmin结合内网穿透远程访问
  • 自定义 SpringBoot starter
  • 文件操作和IO
  • 构建深度学习驱动的多目标检测系统:YOLO模型及应用
  • 高并发内存池
  • Jupyter Notebook 常用快捷键和魔法命令
  • vue中子传父之间通信(this.$emit触发父组件方法和.sync修饰符与$emit(update:xxx))
  • 低GI功能大米升温:千亿规模潜力,解决八成慢病老人主食难题
  • 【栈和队列】常见面试题
  • 【391天】每日项目总结系列128(2018.03.03)
  • 0基础学习移动端适配
  • 345-反转字符串中的元音字母
  • Angular Elements 及其运作原理
  • axios 和 cookie 的那些事
  • extract-text-webpack-plugin用法
  • HTML-表单
  • HTTP--网络协议分层,http历史(二)
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • javascript面向对象之创建对象
  • Python学习之路16-使用API
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • 多线程事务回滚
  • 服务器之间,相同帐号,实现免密钥登录
  • 机器学习中为什么要做归一化normalization
  • 突破自己的技术思维
  • 学习使用ExpressJS 4.0中的新Router
  • 用jQuery怎么做到前后端分离
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • #WEB前端(HTML属性)
  • (07)Hive——窗口函数详解
  • (4)事件处理——(7)简单事件(Simple events)
  • (C)一些题4
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (二)windows配置JDK环境
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)ssm码农论坛 毕业设计 231126
  • (七)glDrawArry绘制
  • (十)c52学习之旅-定时器实验
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)c++ std::pair 与 std::make
  • (转)重识new
  • .aanva
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .Net Core 笔试1
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Project Open Day(2011.11.13)
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken