获取Spring的上下文环境ApplicationContext的最简单方式

 更新时间:2021年08月14日 10:06:21   作者:蓝魔830  
这篇文章主要介绍了获取Spring的上下文环境ApplicationContext的最简单方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

获取Spring上下文环境ApplicationContext

Web项目中发现有人如此获得Spring的上下环境:

public class SpringUtil {
       public static ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
       public static Object getBean(String serviceName){
             return context.getBean(serviceName);
       }
}

在web项目中这种方式非常不可取!!!

分析:

首先,主要意图就是获得Spring上下文;

其次,有了Spring上下文,希望通过getBean()方法获得Spring管理的Bean的对象;

最后,为了方便调用,把上下文定义为static变量或者getBean方法定义为static方法;

但是,在web项目中,系统一旦启动,web服务器会初始化Spring的上下文的,我们可以很优雅的获得Spring的ApplicationContext对象。

如果使用

new ClassPathXmlApplicationContext("applicationContext.xml");

相当于重新初始化一遍!!!!

也就是说,重复做启动时候的初始化工作,第一次执行该类的时候会非常耗时!!!!!

正确的做法是:

@Component
public class SpringContextUtil implements ApplicationContextAware {
         private static ApplicationContext applicationContext; // Spring应用上下文环境
         /*
          * 实现了ApplicationContextAware 接口,必须实现该方法;
          *通过传递applicationContext参数初始化成员变量applicationContext
          */
         public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
               SpringContextUtil.applicationContext = applicationContext;
         } 
         public static ApplicationContext getApplicationContext() {
                return applicationContext;
         }
          @SuppressWarnings("unchecked")
          public static <T> T getBean(String name) throws BeansException {
                     return (T) applicationContext.getBean(name);
           }
}

注意:

这个地方使用了Spring的注解@Component,如果不是使用annotation的方式,而是使用xml的方式管理Bean,记得写入配置文件

<bean id="springContextUtil" class="com.ecdatainfo.util.SpringContextUtil" singleton="true" />

其实

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

这种方式获取Sping上下文环境,最主要是在测试环境中使用,比如写一个测试类,系统不启动的情况下手动初始化Spring上下文再获取对象!

Spring上下文(ApplicationContext)理解

什么是Spring应用上下文呢???

什么是应用上下文呢,应用上下文即是Spring容器的一种抽象化表述;而我们常见的ApplicationContext本质上说就是一个维护Bean定义以及对象之间协作关系的高级接口。

Spring的核心是容器,而容器并不唯一,框架本身就提供了很多个容器的实现,大概分为两种类型:一种是不常用的BeanFactory,这是最简单的容器,只能提供基本的DI功能;还有一种就是继承了BeanFactory后派生而来的应用上下文,其抽象接口也就是上面提到的的ApplicationContext,它能提供更多企业级的服务,例如解析配置文本信息等等,这也是应用上下文实例对象最常见的应用场景。

有了上下文对象,我们就能向容器注册需要Spring管理的对象了。对于上下文抽象接口,Spring也为我们提供了多种类型的容器实现,供我们在不同的应用场景选择——

  • ① AnnotationConfigApplicationContext:从一个或多个基于java的配置类中加载上下文定义,适用于java注解的方式;
  • ② ClassPathXmlApplicationContext:从类路径下的一个或多个xml配置文件中加载上下文定义,适用于xml配置的方式;
  • ③ FileSystemXmlApplicationContext:从文件系统下的一个或多个xml配置文件中加载上下文定义,也就是说系统盘符中加载xml配置文件;
  • ④ AnnotationConfigWebApplicationContext:专门为web应用准备的,适用于注解方式;
  • ⑤ XmlWebApplicationContext:从web应用下的一个或多个xml配置文件加载上下文定义,适用于xml配置方式。

备注:

通过.class文件获取bean的方法:

public abstract class AbstractCreateRoomHandler implements ApplicationContextAware {
    //存放商家和处理器的映射关系
    private static final Map<Integer, Class<? extends AbstractCreateRoomHandler>> TYPE_HANDLER = new HashMap<>();
    private static ApplicationContext applicationContext;
    static {
        TYPE_HANDLER.put(BusinessCodeEnum.TUSE.getBusinessCode(), TuSeCreateRoomHandler.class);
        //todo 新的商家类型添加到此处
    }
    public static AbstractCreateRoomHandler getCreateRoomHandler(Integer productType) {
        Class<? extends AbstractCreateRoomHandler> clazz = TYPE_HANDLER.getOrDefault(productType, TuSeCreateRoomHandler.class);
        return applicationContext.getBean(clazz);
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • why在重写equals时还必须重写hashcode方法分享

    why在重写equals时还必须重写hashcode方法分享

    首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法
    2013-10-10
  • Java源码解析重写锁的设计结构和细节

    Java源码解析重写锁的设计结构和细节

    这篇文章主要为大家介绍了Java源码解析重写锁的设计结构和细节,这小节我们以共享锁作为案列,自定义一个共享锁。有需要的朋友可以借鉴参考下
    2022-03-03
  • Java8优雅的字符串拼接工具类StringJoiner实例代码

    Java8优雅的字符串拼接工具类StringJoiner实例代码

    这篇文章主要给大家介绍了关于Java8优雅的字符串拼接工具类StringJoiner的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • java中@ModelAttribute注解的作用

    java中@ModelAttribute注解的作用

    本文主要介绍了java中@ModelAttribute注解的作用。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Java中数学相关类的使用教程

    Java中数学相关类的使用教程

    Java是一种广泛使用的编程语言,它提供了许多数学运算的函数和方法,使得开发者可以轻松地进行各种数学计算,下面这篇文章主要给大家介绍了关于Java中数学相关类使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • 使用IDEA反编译没有擦除泛型的原因解析

    使用IDEA反编译没有擦除泛型的原因解析

    Java泛型引入至今已有近20年,“伪泛型”已被认为是所有开发者的共识,没有必要再在反编译后体现出来反倒大大降低了可读性,这篇文章主要介绍了使用IDEA反编译没有擦除泛型的原因解析,需要的朋友可以参考下
    2023-05-05
  • Spring bean配置单例或多例模式方式

    Spring bean配置单例或多例模式方式

    这篇文章主要介绍了Spring bean配置单例或多例模式方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java必须掌握的 4 大基础

    Java必须掌握的 4 大基础

    我们一直在学习Java,但Java中总有一些概念含混不清,不论是对初级还是高级程序员都是如此。所以,这篇文章的目的就是弄清楚这些概念,需要的小伙伴可以参考以下哟
    2021-09-09
  • struts2静态资源映射代码示例

    struts2静态资源映射代码示例

    这篇文章主要介绍了struts2静态资源映射的相关内容,涉及了具体代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-09-09
  • IDEA Maven 配置备忘笔记

    IDEA Maven 配置备忘笔记

    这篇文章主要介绍了IDEA Maven 配置备忘笔记,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09

最新评论