文章目录

  • 一、使用场景
  • 二、springBoot中获取sping管理的bean
    • 2.1 生成工具类SpringContextUtil
    • 2.2 使用工具类SpringContextUtil
    • 2.3 注意事项:getApplicationContext为Null问题
  • 三、参考文档

一、使用场景

某些场景下,需要在某个普通的java类(非Spring框架管理)中使用Spring管理的bean,这个时候可以使用实现 ApplicationContextAware 的方式来获取目标bean.

二、springBoot中获取sping管理的bean

2.1 生成工具类SpringContextUtil

写一个工具类SpringContextUtil,该类实现 ApplicationContextAware,通过 beanName、bean对应的Class、beanName+bean对应的Class 三种方式来获取目标bean,具体如下:

package com.bigbear.test.utils;
@Component
@Slf4j
public class SpringContextUtil implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {if (SpringContextUtil.applicationContext == null) {SpringContextUtil.applicationContext = applicationContext;}log.info("ApplicationContext配置成功,applicationContext对象:"+SpringContextUtil.applicationContext);}public static ApplicationContext  getApplicationContext(){return applicationContext;}/*** 通过beanName获取 Bean* @param beanName* @return*/public static Object getBean(String beanName){return getApplicationContext().getBean(beanName);}/*** 通过class获取Bean* @param clazz* @return*/public static <T> T getBean(Class<T> clazz) {return getApplicationContext().getBean(clazz);}/*** 通过beanName,以及Clazz返回指定的Bean* @param name* @param clazz* @param <T>* @return*/public static <T> T getBean(String beanName, Class<T> clazz) {return getApplicationContext().getBean(beanName, clazz);}
}

1、实现ApplicationContextAware接口:Spring项目启动初始化的过程中,会有一个步骤执行ApplicationContextAware接口的实现类的setApplicationContext方法,这样我们就能拿到applicationContext信息,进而可以通过sprig上下文获取想要的bean。

2、需要使用 @Component ,让spring能够扫描到该工具类;

3、根据需求,可以通过 beanName 或 bean对应的class 获取目标bean;

2.2 使用工具类SpringContextUtil

这里有个被Spring管理的bean : myTestDemo

@Service("myTestDemo")
public class MyTestDemo {@Autowiredprivate UserService userService;public String getPasswordByAppId(String loginName) {UserDo  userDo =  userService.findUserByLoginName(loginName);if(ObjectUtils.isEmpty(userDo) || StringUtils.isEmpty(userDo.getPassword())){return "";}return userDo.getPassword();}
}

在另外一个java类中通过Spring上下文获取这个 “myTestDemo” bean,并用来生成一个对象:

@Configuration
public class ApiIdentificatorConfig {@Bean("apiIdentificator")public ApiIdentificator getApiIdentificator(){// 获取Spring上下文ApplicationContext context = SpringContextUtil.getApplicationContext();//从Spring上下文中取出 myTestBean beanMyTestDemo myTestDemo = (MyTestDemo)context.getBean("myTestDemo");// myTestBean 是生成 apiIdentificator 对象 的构造参数return new DefaultApiIdentificatorImpl(myTestDemo);}
}

2.3 注意事项:getApplicationContext为Null问题

在上述使用过程中可能会出现 “getApplicationContext为Null问题 ”,原因是Spring初始化过程中SpringContextUtil.setApplicationContext() 方法没有被执行,导致 applicationContext 没有获取到。

解决办法:在SpringBoot启动类扫描的时候,该SpringContextUtil类必须优先执行类扫描。

具体来说有两种解法:
way1: 将 SpringContextUtil.java 这个类和springboot启动类放同一包下;
way2: 更改springboot启动类的包扫描路径, 将该类放到第一个扫描的位置即可,如下:

@SpringBootApplication(scanBasePackages = {"com.bigbear.test.utils","com.bigbear.test.*"})
public class SpringBootHelloApplication {public static void main(String[] args) {SpringApplication.run(SpringBootHelloApplication.class, args);}
}

三、参考文档

1、spring boot获取spring容器中的bean对象:https://blog.csdn.net/qq_29235677/article/details/119652555
2、spring启动流程的源码分析:https://blog.csdn.net/qq_29235677/article/details/118458990
3、SpringApplication.run执行流程详解:https://blog.csdn.net/javaheheda/article/details/104963485

【学习笔记】springBoot中获取sping管理的bean相关推荐

  1. 如何在线程中获取spring 管理的bean

    问题说明 今天在web应用中用到了Java多线程的技术来并发处理一些业务,但在执行时一直会报NullPointerException的错误,问题定位了一下发现是线程中的Spring bean没有被注入 ...

  2. C++学习笔记-DLL中动态内存管理

    动态内存管理 在dll中malloc的内存,必须在dll中free 注:这是由Windows自己的特点决定! 如果 a 编译成静态库,有下面两种解决方法: 1.b.dll 和 c.dll 使用同一个款 ...

  3. Kinect+OpenNI学习笔记之6(获取人体骨架并在Qt中显示)

    前言 MS的kinec SDK和OpenNI都提供了人体骨骼跟踪的算法,人体骨骼跟踪算法在kinect人体行为识别中非常重要,该识别过程通常被用来作为行为识别的第一步, 比如说,通过定位人体中的骨骼支 ...

  4. JDBC学习笔记03【JDBC事务管理、数据库连接池、JDBCTemplate】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  5. 项目管理学习笔记二:信息系统服务管理

    项目管理学习笔记二:信息系统服务管理 2010-10-22 09:56:33 标签:信息系统 笔记 项目管理 服务 学习 [推送到技术圈] 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文 ...

  6. Core Data 学习笔记(二)被管理对象模型

    为什么80%的码农都做不了架构师?>>>    目录 Core Data 学习笔记(一)框架简介 Core Data 学习笔记(二)被管理对象模型 Core Data 学习笔记(三) ...

  7. r语言c函数怎么用,R语言学习笔记——C#中如何使用R语言setwd()函数

    在R语言编译器中,设置当前工作文件夹可以用setwd()函数. > setwd("e://桌面//") > setwd("e:\桌面\") > ...

  8. java quartz管理,SpringBoot中使用Quartz管理定时任务的方法

    定时任务在系统中用到的地方很多,例如每晚凌晨的数据备份,每小时获取第三方平台的 Token 信息等等,之前我们都是在项目中规定这个定时任务什么时候启动,到时间了便会自己启动,那么我们想要停止这个定时任 ...

  9. Windows进程与线程学习笔记(七)—— 时间片管理

    Windows进程与线程学习笔记(七)-- 时间片管理 要点回顾 基本概念 CPU时间片 分析 KeUpdateRunTime 分析 KiDispatchInterrupt 备用线程 总结 要点回顾 ...

最新文章

  1. sealos安装k8s集群注意事项:必须关闭任何形式的http_proxy代理
  2. Java经典逻辑编程题(不死神兔问题)
  3. java set path_Java Path.setEffect方法代码示例
  4. 基于pythonselect.select模块通信的实例讲解
  5. H265编码等级以及图像的基础知识
  6. 前端 html5 css3 框架,UI,分享,CSS3,HTML5,前端框架
  7. 网络安全设备常用默认弱口令
  8. jsp+servlet+mysql实现的图书管理系统源码
  9. python 中读取yaml
  10. 数据库连接软件SQLyog 13.1.7 免费下载安装
  11. win32-x64-64\binding.node is not a valid Win32 application
  12. 植物大战僵尸变态辅助开发系列教程(E语言实现和VC6实现)(中)
  13. font-spider压缩web font字体
  14. 算法竞赛入门经典 习题3-2 分子量 Molar Mass
  15. 各个键盘按键KeyValue值
  16. 用户登录和用户注册案例
  17. 如何做一个真正的男人
  18. 2k分辨率显示器 浏览器_如何使浏览器使用显示器的完整分辨率?
  19. JavaSocket编程之Netty框架线程模型
  20. 铅直渐近线、水平渐近线、斜渐近线 快速算法 笔记

热门文章

  1. 【HMS Core】Health Kit如何获取跑步锻炼记录的轨迹记录?
  2. 一张图让你理清渗透思路
  3. html绝对定位到相邻元素中间,css – 在另一个元素的中心下方水平居中绝对定位元素...
  4. MotioninJoy win10下装载失败
  5. 分享淘宝时间服务器同步时间接口api和苏宁时间服务器接口api
  6. 基础算法与数据结构——页面置换算法
  7. 中润光学在科创板IPO过会:拟募资4亿元,张平华为实际控制人
  8. 拼题A ——2021 跨年挑战赛
  9. 看看梁朝伟送给太太的12克拉钻戒~
  10. IMSI和TIMSI