在spring中,我们通过如下代码取得一个spring托管类:
在spring boot中,我参考了如下三篇文章:
让非Spring管理的类获得一个Bean
http://blog.sina.com.cn/s/blog_72ef7bea0102wcvk.htmlblog.sina.com.cn/s/blog_72ef7bea0102wcvk.html
Spring Boot普通类调用bean
http://blog.csdn.net/u014695188/article/details/52396880
SpringBoot-获取上下文
http://www.2cto.com/kf/201701/582935.html
做了一些实践。
首先,我们需要一个媒介,来取得AppicationContext——SpringUtil
这个类有两种方式:
1. 实现ApplicationContextAware接口
@Componentpublic class SpringUtil implements ApplicationContextAware { private static ApplicationContext applicationContext = null;// 非@import显式注入,@Component是必须的,且该类必须与main同包或子包 // 若非同包或子包,则需手动import 注入,有没有@Component都一样 // 可复制到Test同包测试 @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if(SpringUtil.applicationContext == null){ SpringUtil.applicationContext = applicationContext; } System.out.println("---------------com.ilex.jiutou.util.Test.Main.SubPackage.SpringUtil---------------"); } //获取applicationContext public static ApplicationContext getApplicationContext() { return applicationContext; } //通过name获取 Bean. public static Object getBean(String name){ return getApplicationContext().getBean(name); } //通过class获取Bean. public static <T> T getBean(Class<T> clazz){ return getApplicationContext().getBean(clazz); } //通过name,以及Clazz返回指定的Bean public static <T> T getBean(String name,Class<T> clazz){ return getApplicationContext().getBean(name, clazz); } }
需要被spring注入,覆写setApplicationContext
2. 普通类
//@Component 在不可扫描区域,且不需要注入,作为一个普通的util类public class SpringUtil{ private static ApplicationContext applicationContext = null; public static void setApplicationContext(ApplicationContext applicationContext){ if(SpringUtil.applicationContext == null){ SpringUtil.applicationContext = applicationContext; } } //获取applicationContext public static ApplicationContext getApplicationContext() { return applicationContext; } //通过name获取 Bean. public static Object getBean(String name){ return getApplicationContext().getBean(name); } //通过class获取Bean. public static <T> T getBean(Class<T> clazz){ return getApplicationContext().getBean(clazz); } //通过name,以及Clazz返回指定的Bean public static <T> T getBean(String name,Class<T> clazz){ return getApplicationContext().getBean(name, clazz); } }
不需要被注入,但需要手动调用
主函数
@SpringBootApplication@Import(value={UserFooterService.class})public class Test { public static void main(String[] args) { ApplicationContext ctx = SpringApplication.run(Test.class, args); // SpringUtil.setApplicationContext(ctx); 这个对应于AnoStatic String[] beanNames = ctx.getBeanDefinitionNames(); System.out.println("beanNames个数:"+beanNames.length); for(String bn:beanNames){ System.out.println(bn); } // 测试加载UserFooterService UserFooterService userFooterService = (UserFooterService) SpringUtil.getBean(UserFooterService.class); List<Map<String,Object>> list = userFooterService.hotTopic("0", "5"); System.out.println(list.toString()); // 测试加载SpringUtil SpringUtil springUtil = (SpringUtil)SpringUtil.getBean(SpringUtil.class); System.out.println(springUtil); }// @Bean// public SpringUtil springUtil() {// return new SpringUtil();// }}
UserFooterService是一个业务类,这里不榕树
建立如下的测试结构:
Main/Test 主函数
AnoStatic/SpringUtil 普通类
Main/SubPackage/SpringUtil 实现ApplicationContextAware,但为主函数子包
NonSubPackage/SpringUtil 实现ApplicationContextAware,但非主函数子包和同包
SpringUtil注入方式有三种,在参考的三篇博客均有说明,在此仅总结:
1. 类与SpringBootApplication同包或子包,此在ComponentScan的扫描范围之内,在类上@Component注解即可,会被自动注入;
2. 无论位置,都可通过在主函数用@import或@bean来手动注入。
第一种SpringUtil方式必须被spring注入,否则会报
Exception in thread "main" java.lang.NullPointerException
at com.ilex.jiutou.util.Test.NonSubPackage.SpringUtil.getBean(SpringUtil.java:40)
at com.ilex.jiutou.util.Test.Main.Test.main(Test.java:34)
表示applicationContext获取失败
第二种方式,SpringUtil可被注入可不被注入
当不注入时,主函数这一段:
// 测试加载SpringUtil SpringUtil springUtil = (SpringUtil)SpringUtil.getBean(SpringUtil.class); System.out.println(springUtil);
报错:
No qualifying bean of type [**.Test.AnoStatic.SpringUtil
Original url: Access
Created at: 2020-10-13 16:01:11
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论