spring boot 的 ApplicationContext 及 getbean
在spring中,我们通过如下代码取得一个spring托管类:
- ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
- ac.getBean("beanId");
在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接口
@Component
public class SpringUtil implements ApplicationContextAware {<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> ApplicationContext applicationContext = <span class="hljs-keyword">null</span>;</br>
// 非@import显式注入,@Component是必须的,且该类必须与main同包或子包
// 若非同包或子包,则需手动import 注入,有没有@Component都一样
// 可复制到Test同包测试<span class="hljs-annotation">@Override</span></br>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setApplicationContext</span><span class="hljs-params">(ApplicationContext applicationContext)</span> <span class="hljs-keyword">throws</span> BeansException </span>{</br>
<span class="hljs-keyword">if</span>(SpringUtil.applicationContext == <span class="hljs-keyword">null</span>){</br>
SpringUtil.applicationContext = applicationContext;</br>
}</br>
System.out.println(<span class="hljs-string">"---------------com.ilex.jiutou.util.Test.Main.SubPackage.SpringUtil---------------"</span>);</br>
}</br></br> <span class="hljs-comment">//获取applicationContext</span></br>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> ApplicationContext <span class="hljs-title">getApplicationContext</span><span class="hljs-params">()</span> </span>{</br>
<span class="hljs-keyword">return</span> applicationContext;</br>
}</br>
//通过name获取 Bean.
public static Object getBean(String name){
return getApplicationContext().getBean(name);}</br></br> <span class="hljs-comment">//通过class获取Bean.</span></br>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <T> <span class="hljs-function">T <span class="hljs-title">getBean</span><span class="hljs-params">(Class<T> clazz)</span></span>{</br>
<span class="hljs-keyword">return</span> getApplicationContext().getBean(clazz);</br>
}</br></br> <span class="hljs-comment">//通过name,以及Clazz返回指定的Bean</span></br>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <T> <span class="hljs-function">T <span class="hljs-title">getBean</span><span class="hljs-params">(String name,Class<T> clazz)</span></span>{</br>
<span class="hljs-keyword">return</span> getApplicationContext().getBean(name, clazz);</br>
}</br>
}
需要被spring注入,覆写setApplicationContext
2. 普通类
//@Component 在不可扫描区域,且不需要注入,作为一个普通的util类
public class SpringUtil{
private static ApplicationContext applicationContext = null;<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setApplicationContext</span><span class="hljs-params">(ApplicationContext applicationContext)</span></span>{</br>
<span class="hljs-keyword">if</span>(SpringUtil.applicationContext == <span class="hljs-keyword">null</span>){</br>
SpringUtil.applicationContext = applicationContext;</br>
}</br></br> }</br></br> <span class="hljs-comment">//获取applicationContext</span></br>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> ApplicationContext <span class="hljs-title">getApplicationContext</span><span class="hljs-params">()</span> </span>{</br>
<span class="hljs-keyword">return</span> applicationContext;</br>
}</br></br> <span class="hljs-comment">//通过name获取 Bean.</span></br>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> Object <span class="hljs-title">getBean</span><span class="hljs-params">(String name)</span></span>{</br>
<span class="hljs-keyword">return</span> getApplicationContext().getBean(name);</br></br> }</br> <span class="hljs-comment">//通过class获取Bean.</span></br>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <T> <span class="hljs-function">T <span class="hljs-title">getBean</span><span class="hljs-params">(Class<T> clazz)</span></span>{</br>
<span class="hljs-keyword">return</span> getApplicationContext().getBean(clazz);</br>
}</br> <span class="hljs-comment">//通过name,以及Clazz返回指定的Bean</span></br>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <T> <span class="hljs-function">T <span class="hljs-title">getBean</span><span class="hljs-params">(String name,Class<T> clazz)</span></span>{</br>
<span class="hljs-keyword">return</span> getApplicationContext().getBean(name, clazz);</br>
}</br>
}
不需要被注入,但需要手动调用
主函数
@SpringBootApplication
@Import(value={UserFooterService.class})
public class Test {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(Test.class, args);<span class="hljs-comment">// SpringUtil.setApplicationContext(ctx); 这个对应于AnoStatic</span></br></br> String[] beanNames = ctx.getBeanDefinitionNames();</br>
System.out.println(<span class="hljs-string">"beanNames个数:"</span>+beanNames.length);</br>
<span class="hljs-keyword">for</span>(String bn:beanNames){</br>
System.out.println(bn);</br>
}</br></br> <span class="hljs-comment">// 测试加载UserFooterService</span></br>
UserFooterService userFooterService = (UserFooterService) SpringUtil.getBean(UserFooterService.class);</br>
List<Map<String,Object>> list = userFooterService.hotTopic(<span class="hljs-string">"0"</span>, <span class="hljs-string">"5"</span>);</br>
System.out.println(list.toString());</br></br> <span class="hljs-comment">// 测试加载SpringUtil</span></br>
SpringUtil springUtil = (SpringUtil)SpringUtil.getBean(SpringUtil.class);</br>
System.out.println(springUtil);</br>
}</br></br>
// @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
spring boot 的 ApplicationContext 及 getbean的更多相关文章
- Spring Boot 获取ApplicationContext
package com.demo; import org.springframework.beans.BeansException; import org.springframework.contex ...
- 曹工说Spring Boot源码(4)-- 我是怎么自定义ApplicationContext,从json文件读取bean definition的?
写在前面的话 相关背景及资源: 曹工说Spring Boot源码系列开讲了(1)-- Bean Definition到底是什么,附spring思维导图分享 工程代码地址 思维导图地址 工程结构图: 大 ...
- spring boot: 中文显示乱码,在applicationContext里面配置
spring boot: 中文显示乱码,在applicationContext里面配置 applicationContext.properties ########################## ...
- spring boot启动报错Error starting ApplicationContext(未能配置数据源)
主要错误:Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource c ...
- Spring Boot -- 启动流程分析之ApplicationContext 中
上一节我们已经分析到AbsractApplicationContext类refresh方法中的postProcessBeanFactory方法,在分析registerBeanPostProcessor ...
- Running Dubbo On Spring Boot
Dubbo(http://dubbo.io/) 是阿里的开源的一款分布式服务框架.而Spring Boot则是Spring社区这两年致力于打造的简化Java配置的微服务框架. 利用他们各自优势,配置到 ...
- How Spring Boot Autoconfiguration Magic Works--转
原文地址:https://dzone.com/articles/how-springboot-autoconfiguration-magic-works In my previous post &qu ...
- How to use JDBC-Authentication of Spring Boot/Spring Security with Flyway
java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.conte ...
- Spring boot将配置属性注入到bean类中
一.@ConfigurationProperties注解的使用 看配置文件,我的是yaml格式的配置: // file application.yml my: servers: - dev.bar.c ...
随机推荐
- React报错:Laravel React-Router browserHistory 刷新子页面报错404
举例:myblog.com/ 刷新没问题 myblog.com/add 刷新404 browserHistory报404,hashHistory却正常 原因是少路由.web.php添加路由 Route ...
- phpstorm中完成一键快速注释函数头
先保存函数,再在函数头写/**+enter就行了 /** * @param $num1 * @param $num2 * @param $opt * @return float|int */ func ...
- PAT甲级——A1084 Broken Keyboard
On a broken keyboard, some of the keys are worn out. So when you type some sentences, the characters ...
- java浮点运算的陷阱
首先呢,i你要明白double和float. Inifinity: 例如:syso(5.0/0.0+" 和"+0.0 /0.0); 浮点运算的0.0不是真正意义上的0,而是非常接近 ...
- HDU--2191 汶川地震购米(多重背包)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2191 分析:有资金n元,而市场有m种大米,每种大米价格不等,重量不等,数量不等, 并且只能整袋购买.如何用 ...
- git 命令行(二)-创建合并分支
1. 创建和合并分支 1. 我们创建 xu 分支,然后切换到 xu 分支: 2. 用 git branch 命令查看当前分支: git branch命令会列出所有分支,当前分支前面会标一个*号. ...
- struts1 总结吧
以前都是使用struts2,但是新公司要使用struts1,所有只有硬着头皮上了. 一.Dynamic Method Invoc : 自定义的 Action 必须继承 DispatchAction 而 ...
- 关于Cesium 官方教程
最近一直在准备第一次QQ群的Cesium基础培训公开课,虽说使用Cesium也有段日子了,但是要说对Cesium了解有多深,还真不一定.原因是一直以来我都是用哪里学哪里.基于多年开发三维数字地球的底层 ...
- Jmeter分布式测试笔记
在性能测试过程中,如果要求并发数较大时(例如1000+),单机配置cpu与内存等无法支持,则需要使用Jmeter的分布式测试方法. 一.一般什么情况下需要分布式 1.前辈经验:比如机器i5双核的cpu ...
- Merge array and hash in ruby if key appears in array
I have two arrays one = [1,2,3,4,5,6,7] and two = [{1=>'10'},{3=>'22'},{7=>'40'}] Two will ...