【学习笔记】springBoot中获取sping管理的bean
文章目录
- 一、使用场景
- 二、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相关推荐
- 如何在线程中获取spring 管理的bean
问题说明 今天在web应用中用到了Java多线程的技术来并发处理一些业务,但在执行时一直会报NullPointerException的错误,问题定位了一下发现是线程中的Spring bean没有被注入 ...
- C++学习笔记-DLL中动态内存管理
动态内存管理 在dll中malloc的内存,必须在dll中free 注:这是由Windows自己的特点决定! 如果 a 编译成静态库,有下面两种解决方法: 1.b.dll 和 c.dll 使用同一个款 ...
- Kinect+OpenNI学习笔记之6(获取人体骨架并在Qt中显示)
前言 MS的kinec SDK和OpenNI都提供了人体骨骼跟踪的算法,人体骨骼跟踪算法在kinect人体行为识别中非常重要,该识别过程通常被用来作为行为识别的第一步, 比如说,通过定位人体中的骨骼支 ...
- JDBC学习笔记03【JDBC事务管理、数据库连接池、JDBCTemplate】
黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...
- 项目管理学习笔记二:信息系统服务管理
项目管理学习笔记二:信息系统服务管理 2010-10-22 09:56:33 标签:信息系统 笔记 项目管理 服务 学习 [推送到技术圈] 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文 ...
- Core Data 学习笔记(二)被管理对象模型
为什么80%的码农都做不了架构师?>>> 目录 Core Data 学习笔记(一)框架简介 Core Data 学习笔记(二)被管理对象模型 Core Data 学习笔记(三) ...
- r语言c函数怎么用,R语言学习笔记——C#中如何使用R语言setwd()函数
在R语言编译器中,设置当前工作文件夹可以用setwd()函数. > setwd("e://桌面//") > setwd("e:\桌面\") > ...
- java quartz管理,SpringBoot中使用Quartz管理定时任务的方法
定时任务在系统中用到的地方很多,例如每晚凌晨的数据备份,每小时获取第三方平台的 Token 信息等等,之前我们都是在项目中规定这个定时任务什么时候启动,到时间了便会自己启动,那么我们想要停止这个定时任 ...
- Windows进程与线程学习笔记(七)—— 时间片管理
Windows进程与线程学习笔记(七)-- 时间片管理 要点回顾 基本概念 CPU时间片 分析 KeUpdateRunTime 分析 KiDispatchInterrupt 备用线程 总结 要点回顾 ...
最新文章
- sealos安装k8s集群注意事项:必须关闭任何形式的http_proxy代理
- Java经典逻辑编程题(不死神兔问题)
- java set path_Java Path.setEffect方法代码示例
- 基于pythonselect.select模块通信的实例讲解
- H265编码等级以及图像的基础知识
- 前端 html5 css3 框架,UI,分享,CSS3,HTML5,前端框架
- 网络安全设备常用默认弱口令
- jsp+servlet+mysql实现的图书管理系统源码
- python 中读取yaml
- 数据库连接软件SQLyog 13.1.7 免费下载安装
- win32-x64-64\binding.node is not a valid Win32 application
- 植物大战僵尸变态辅助开发系列教程(E语言实现和VC6实现)(中)
- font-spider压缩web font字体
- 算法竞赛入门经典 习题3-2 分子量 Molar Mass
- 各个键盘按键KeyValue值
- 用户登录和用户注册案例
- 如何做一个真正的男人
- 2k分辨率显示器 浏览器_如何使浏览器使用显示器的完整分辨率?
- JavaSocket编程之Netty框架线程模型
- 铅直渐近线、水平渐近线、斜渐近线 快速算法 笔记