一、使用ApplicationContextInitializer,让SpringApplication启动时进行回调,然后获取ApplicationContext

1.创建一个SpringContextHolder对象用来保存ApplicationContext对象

import org.springframework.context.ApplicationContext;public class SpringContextHolder {/*** 保存ApplicationContext,可在项目中任意位置中取出ApplicationContext*/private static ApplicationContext applicationContext;public static ApplicationContext getApplicationContext() {return applicationContext;}public static void setApplicationContext(ApplicationContext applicationContext) {SpringContextHolder.applicationContext = applicationContext;}/*** 通过name获取 Bean.* @param name* @return*/public static Object getBean(String name){return applicationContext.getBean(name);}/*** 通过class获取class下的全部Bean.* @param clazz* @param <T>* @return*/public static <T> Map<String, T> getBeans(Class<T> clazz){return applicationContext.getBeansOfType(clazz);}/*** 通过class获取Bean.* @param clazz* @param <T>* @return*/public static <T> T getBean(Class<T> clazz){return applicationContext.getBean(clazz);}}

2.在启动类中注册ApplicationContextInitializer接口的匿名对象

import com.yxs.demo.utils.SpringContextHolder;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication springApplication = new SpringApplication(DemoApplication.class);//注册ApplicationContextInitializer接口//让SpringApplication启动时进行回调//调用SpringContextHolder静态方法设置上下文对象//org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContextspringApplication.addInitializers(SpringContextHolder::setApplicationContext);springApplication.run(args);}
}

二、SpringApplication的run方法的返回值就是ApplicationContext实例对象

import com.yxs.demo.utils.SpringContextHolder;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {//org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContextConfigurableApplicationContext applicationContext = SpringApplication.run(DemoApplication.class, args);SpringContextHolder.setApplicationContext(applicationContext);}
}

三、实现ApplicationContextAware接口,利用Spring Bean的生命周期,在Bean初始化时获取ApplicationContext

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;import java.util.Map;@Component
public class SpringContextHolder implements ApplicationContextAware {/*** 保存ApplicationContext,可在项目中任意位置取出ApplicationContext*/private ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {//org.springframework.web.context.support.GenericWebApplicationContextthis.applicationContext = applicationContext;}public ApplicationContext getApplicationContext() {return applicationContext;}/*** 通过name获取 Bean.* @param name* @return*/public Object getBean(String name){return applicationContext.getBean(name);}/*** 通过class获取class下的全部Bean.* @param clazz* @param <T>* @return*/public <T> Map<String, T> getBeans(Class<T> clazz){return applicationContext.getBeansOfType(clazz);}/*** 通过class获取Bean.* @param clazz* @param <T>* @return*/public <T> T getBean(Class<T> clazz){return applicationContext.getBean(clazz);}
}

四、实现ApplicationListener接口,在SpringApplication启动时,监听ApplicationContextEvent事件触发回调,获取ApplicationContext

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ApplicationContextEvent;
import org.springframework.stereotype.Component;import java.util.Map;@Component
public class SpringContextHolder implements ApplicationListener<ApplicationContextEvent> {/*** 保存ApplicationContext,可在项目中任意位置取出ApplicationContext*/private ApplicationContext applicationContext;@Overridepublic void onApplicationEvent(ApplicationContextEvent applicationContextEvent) {//org.springframework.web.context.support.GenericWebApplicationContextthis.applicationContext = applicationContextEvent.getApplicationContext();}public ApplicationContext getApplicationContext() {return applicationContext;}/*** 通过name获取 Bean.* @param name* @return*/public Object getBean(String name){return applicationContext.getBean(name);}/*** 通过class获取class下的全部Bean.* @param clazz* @param <T>* @return*/public <T> Map<String, T> getBeans(Class<T> clazz){return applicationContext.getBeansOfType(clazz);}/*** 通过class获取Bean.* @param clazz* @param <T>* @return*/public <T> T getBean(Class<T> clazz){return applicationContext.getBean(clazz);}
}

Spring获取上下文的四种方式方式相关推荐

  1. java按钮权限控制_详解Spring Security 中的四种权限控制方式

    Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Se ...

  2. Spring的四种注入方式

    Spring的四种注入方式 1.set方法注入 2.构造器注入 3.静态工厂注入 4.实例工厂注入 我使用下面两个类来进行注入的演示,这两个类分别是User和Car类: Car类: public cl ...

  3. spring(转账为例)四种实现方式一

    Spring事务管理的四种方式(以银行转账为例) 一.事务的作用 将若干的数据库操作作为一个整体控制,一起成功或一起失败. 原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生 ...

  4. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (四) —— ContentProvider...

    ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制.一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制.并且此种方式忽略了底层的数据存储实现,Cont ...

  5. Android数据的四种存储方式

    很清晰的思路,转自Android数据的四种存储方式 作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQL ...

  6. Android开发之入门基础篇--拨号器的四种实现方式

    整理之前的学习笔记,发现了很多在学习Android基础的过程中的一些很适合一些新手开发的代码,想想之前也是一步一个脚印,一行一行的代码敲出来的,虽然这些代码很简单,但是里面的编程思路却是很有学习意义的 ...

  7. 【Python基础】Python爬虫的两套解析方法和四种信息提取方式

    Python爬虫 Author:Iouwill Machine Learning Lab 分享一篇往日旧文章,非常实用. 对于大多数朋友而言,爬虫绝对是学习python的最好的起手和入门方式.因为爬虫 ...

  8. OAuth2.0的四种授权方式

    在OAuth2.0中,OAuth2.0 provider负责保护暴露在外的资源,第三方应用客户端Client可以独立的或代表用户Owner来访问这些受保护的资源,provider提供token令牌的管 ...

  9. php xml 四种,xml中常见的四种解析方式是什么?

    xml解析方式有:1.DOM解析方法,可以对xml文档进行修改操作:2.SAX解析方法,解析速度快,占用内存少:3.JDOM解析方法,查找方便:4.DOM4J解析方法,解析XML的速度快. 在XML的 ...

最新文章

  1. html显示三维模型restful,返回带有Flask Restful的呈现模板,在浏览器中显示HTML
  2. 用C#获取硬盘序列号,CPU序列号,网卡MAC地址
  3. Windows 10 中 Eclipse中无法添加Courier New字体的解决方法!
  4. 【WebGL】WebGL入门
  5. linux学习之lvm-逻辑卷管理器
  6. iOS--利用Fastlane实现自动化打包
  7. CCNA学习指南 第七章 下载
  8. UC、火绒联合发布专杀工具 清除 2345 锁首木马
  9. 2016 hack.lu-ctf redacted RSA数据恢复
  10. Navitas GaN IC 驱动 Vivo 可折叠手机
  11. 基因检测-外显子链接问题
  12. 软件测试学习之路-----文本编辑器和计算机基本命令笔记
  13. TEZ和MR简要区别
  14. stm8l051 halt之后外部中断唤醒问题
  15. 让1.6亿美元的公司导致破产被50万美元贱卖的无解的Python bug
  16. 谷歌学术(google scholar)个人主页的论文信息不准确怎么办?
  17. CSS3属性justify-content
  18. 四川多多开店:拼多多银行卡认证流程是什么
  19. 全国计算机公共等级考试PETS,2016年下半年全国公共英语等级考试(PETS)和全国计算机等级考试(NCRE)考务工作视频会议顺利召开...
  20. 从源码角度拆解SpringSecurity之C位的AuthenticationManager

热门文章

  1. BRIEF描述子原理、 python源码实现及基于opencv实现
  2. 【SpringCloud系列】服务注册与发现 - Eureka Server源码分析(2)
  3. 放大电路中的反馈(一)
  4. SPI的NSS硬件模式
  5. 国睿驰120gb固态硬盘测试软件,小巧极速 国睿驰精睿系列移动SSD评测
  6. 南加州大学计算机科学案例,南加州大学计算机科学硕士录取
  7. Kubernetes基础详解
  8. 风暴孵化:手游代理加盟水很深,如何避免入坑?
  9. Anima2D官方中文使用手册(对应Anima2D1.1.4)
  10. .NET程序中加入Autodesk Design Review 2013 ,打包完成后安装提示未注册XXX.dll解决办法