Spring获取上下文的四种方式方式
一、使用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获取上下文的四种方式方式相关推荐
- java按钮权限控制_详解Spring Security 中的四种权限控制方式
Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Se ...
- Spring的四种注入方式
Spring的四种注入方式 1.set方法注入 2.构造器注入 3.静态工厂注入 4.实例工厂注入 我使用下面两个类来进行注入的演示,这两个类分别是User和Car类: Car类: public cl ...
- spring(转账为例)四种实现方式一
Spring事务管理的四种方式(以银行转账为例) 一.事务的作用 将若干的数据库操作作为一个整体控制,一起成功或一起失败. 原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生 ...
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (四) —— ContentProvider...
ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制.一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制.并且此种方式忽略了底层的数据存储实现,Cont ...
- Android数据的四种存储方式
很清晰的思路,转自Android数据的四种存储方式 作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQL ...
- Android开发之入门基础篇--拨号器的四种实现方式
整理之前的学习笔记,发现了很多在学习Android基础的过程中的一些很适合一些新手开发的代码,想想之前也是一步一个脚印,一行一行的代码敲出来的,虽然这些代码很简单,但是里面的编程思路却是很有学习意义的 ...
- 【Python基础】Python爬虫的两套解析方法和四种信息提取方式
Python爬虫 Author:Iouwill Machine Learning Lab 分享一篇往日旧文章,非常实用. 对于大多数朋友而言,爬虫绝对是学习python的最好的起手和入门方式.因为爬虫 ...
- OAuth2.0的四种授权方式
在OAuth2.0中,OAuth2.0 provider负责保护暴露在外的资源,第三方应用客户端Client可以独立的或代表用户Owner来访问这些受保护的资源,provider提供token令牌的管 ...
- php xml 四种,xml中常见的四种解析方式是什么?
xml解析方式有:1.DOM解析方法,可以对xml文档进行修改操作:2.SAX解析方法,解析速度快,占用内存少:3.JDOM解析方法,查找方便:4.DOM4J解析方法,解析XML的速度快. 在XML的 ...
最新文章
- html显示三维模型restful,返回带有Flask Restful的呈现模板,在浏览器中显示HTML
- 用C#获取硬盘序列号,CPU序列号,网卡MAC地址
- Windows 10 中 Eclipse中无法添加Courier New字体的解决方法!
- 【WebGL】WebGL入门
- linux学习之lvm-逻辑卷管理器
- iOS--利用Fastlane实现自动化打包
- CCNA学习指南 第七章 下载
- UC、火绒联合发布专杀工具 清除 2345 锁首木马
- 2016 hack.lu-ctf redacted RSA数据恢复
- Navitas GaN IC 驱动 Vivo 可折叠手机
- 基因检测-外显子链接问题
- 软件测试学习之路-----文本编辑器和计算机基本命令笔记
- TEZ和MR简要区别
- stm8l051 halt之后外部中断唤醒问题
- 让1.6亿美元的公司导致破产被50万美元贱卖的无解的Python bug
- 谷歌学术(google scholar)个人主页的论文信息不准确怎么办?
- CSS3属性justify-content
- 四川多多开店:拼多多银行卡认证流程是什么
- 全国计算机公共等级考试PETS,2016年下半年全国公共英语等级考试(PETS)和全国计算机等级考试(NCRE)考务工作视频会议顺利召开...
- 从源码角度拆解SpringSecurity之C位的AuthenticationManager
热门文章
- BRIEF描述子原理、 python源码实现及基于opencv实现
- 【SpringCloud系列】服务注册与发现 - Eureka Server源码分析(2)
- 放大电路中的反馈(一)
- SPI的NSS硬件模式
- 国睿驰120gb固态硬盘测试软件,小巧极速 国睿驰精睿系列移动SSD评测
- 南加州大学计算机科学案例,南加州大学计算机科学硕士录取
- Kubernetes基础详解
- 风暴孵化:手游代理加盟水很深,如何避免入坑?
- Anima2D官方中文使用手册(对应Anima2D1.1.4)
- .NET程序中加入Autodesk Design Review 2013 ,打包完成后安装提示未注册XXX.dll解决办法