ApplicationContext
对象是Spring
开源框架的上下文对象实例,在项目运行时自动装载Handler
内的全部信息到内存。传统的获取方式有不少种,不过随着Spring
版本的不断迭代,官方也慢慢的不建议使用部分方式。下面我简单介绍一种Spring
官方推荐使用的方式!git
基于SpringBoot平台完成ApplicationContext
对象的获取,并经过实例手动获取Spring
管理的bean
.spring
本章项目不须要太多的内容,添加Web依赖就能够了。api
这个接口对象就是咱们今天的主角,其实以实现ApplicationContextAware
接口的方式获取ApplicationContext
对象实例并非SpringBoot特有的功能,早在Spring3.0x版本以后就存在了这个接口,在传统的Spring
项目内一样是能够获取到ApplicationContext
实例的,下面咱们看看该如何编码才能达到咱们的效果呢?app
建立一个实体类并实现ApplicationContextAware
接口,重写接口内的setApplicationContext
方法来完成获取ApplicationContext
实例的方法,代码以下所示:框架
package com.xunmei.api; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; /** * 获取Spring上下文对象 * ======================== * Created with IntelliJ IDEA. * User:恒宇少年 * Date:2017/8/26 * Time:23:25 * 码云:http://git.oschina.net/jnyqy * ======================== */ @Component public class ApplicationContextProvider implements ApplicationContextAware { /** * 上下文对象实例 */ private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } /** * 获取applicationContext * @return */ public ApplicationContext getApplicationContext() { return applicationContext; } /** * 经过name获取 Bean. * @param name * @return */ public Object getBean(String name){ return getApplicationContext().getBean(name); } /** * 经过class获取Bean. * @param clazz * @param <T> * @return */ public <T> T getBean(Class<T> clazz){ return getApplicationContext().getBean(clazz); } /** * 经过name,以及Clazz返回指定的Bean * @param name * @param clazz * @param <T> * @return */ public <T> T getBean(String name,Class<T> clazz){ return getApplicationContext().getBean(name, clazz); } }
咱们拿到ApplicationContext
对象实例后就能够手动获取Bean
的注入实例对象,在ApplicationContextProvider
类内我简单的实现了几个方法来获取指定的Bean
实例,固然你能够添加更多的方法来完成更多的业务逻辑。ide
若是你是想在非Spring
管理的实体内使用ApplicationContext
还不想采用注入ApplicationContextProvider
来完成实例化,这时咱们能够修改ApplicationContext
实例对象为静态实例,方法改成静态方法,这样在外部一样是能够获取到指定Bean
的实例。以下所示:学习
@Component public class ApplicationContextProvider implements ApplicationContextAware { /** * 上下文对象实例 */ private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } /** * 获取applicationContext * @return */ public static ApplicationContext getApplicationContext() { return applicationContext; } /** * 经过name获取 Bean. * @param name * @return */ public static Object getBean(String name){ return getApplicationContext().getBean(name); } /** * 经过class获取Bean. * @param clazz * @param <T> * @return */ public static <T> T getBean(Class<T> clazz){ return getApplicationContext().getBean(clazz); } /** * 经过name,以及Clazz返回指定的Bean * @param name * @param clazz * @param <T> * @return */ public static <T> T getBean(String name,Class<T> clazz){ return getApplicationContext().getBean(name, clazz); } }
这里要注意ApplicationContextProvider
类上的@Component
注解是不能够去掉的,去掉后Spring
就不会自动调用setApplicationContext
方法来为咱们设置上下文实例。this
本章内容较少,主要讲解了SpringBoot
平台下采用ApplicationContextAware
的方式完成ApplicationContext
实例的获取,并经过ApplicationContext
实例完成对Spring
管理的Bean
实例手动获取。编码
SpringBoot相关系列文章请访问:目录:SpringBoot学习目录
QueryDSL相关系列文章请访问:QueryDSL通用查询框架学习目录
SpringDataJPA相关系列文章请访问:目录:SpringDataJPA学习目录
感谢阅读!
欢迎加入QQ技术交流群,共同进步。QQ技术交流群spa