使用SpringContextHolder获取bean实例

文章转自:https://blog.csdn.net/chenyiminnanjing/article/details/78618847

今天在一个utils包下的文件中写一个方法的时候想去使用@autowired注入一些对象,但发现不可以直接使用@Autowired,因为方法是static,方法中使用的对象也必须是static,但正常情况下@Autowired无法注入静态的bean,于是发现项目中用到了springContextHolder,通过使用

 private static Constants constants = SpringContextHolder.getBean(Constants.class);

这个方法就可以拿到静态的contants对象,从而获取到其中的变量等内容。于是就仔细看了看SpringContextHolder。 
下面是完整代码

/**
 * Copyright &copy; 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
 */
package com.cmb.bip.utils;

import org.apache.commons.lang3.Validate;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;

/**
 * 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候取出ApplicaitonContext.
 *
 */
@Service
@Lazy(false)
public class SpringContextHolder implements ApplicationContextAware, DisposableBean {

    private static ApplicationContext applicationContext = null;

    /**
     * 取得存储在静态变量中的ApplicationContext.
     */
    public static ApplicationContext getApplicationContext() {
        assertContextInjected();
        return applicationContext;
    }

    /**
     * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) {
        assertContextInjected();
        return (T) applicationContext.getBean(name);
    }

    /**
     * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
     */
    public static <T> T getBean(Class<T> requiredType) {
        assertContextInjected();
        return applicationContext.getBean(requiredType);
    }

    /**
     * 清除SpringContextHolder中的ApplicationContext为Null.
     */
    public static void clearHolder() {
        applicationContext = null;
    }

    /**
     * 实现ApplicationContextAware接口, 注入Context到静态变量中.
     */
    @Override
    public void setApplicationContext(ApplicationContext appContext) {
        applicationContext = appContext;
    }

    /**
     * 实现DisposableBean接口, 在Context关闭时清理静态变量.
     */
    @Override
    public void destroy() throws Exception {
        SpringContextHolder.clearHolder();
    }

    /**
     * 检查ApplicationContext不为空.
     */
    private static void assertContextInjected() {
        Validate.validState(applicationContext != null, "applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.");
    }
}

看了看这个好像是跟网上的一样,应该是一个固定代码。 
这里正常情况下应该去配置文件配置出SpringContextHolder的bean,比如

<bean id="springContextHolder" class="com.cmb.bip.utils.SpringContextHolder" />  

但我找了一圈发现我们的代码中没有,然后发现是我们使用了@Service。同时和这句

<!-- 使用Annotation自动注册Bean -->
    <context:component-scan base-package="com.cmb.bip"></context:component-scan>

这样同样也是注册了springContextHolder这个bean了。 
有了springContextHolder这个bean后就可以使用其下的getbean方法,从而获取到constants对象了。 
而对于为何springContextHolder就能够使用到getbean方法则是因为其继承了ApplicationContextAware。通过它Spring容器会自动把上下文环境对象调用ApplicationContextAware接口中的setApplicationContext方法。

原文地址:https://www.cnblogs.com/cuijiade/p/9664789.html

时间: 2024-10-05 23:25:32

使用SpringContextHolder获取bean实例的相关文章

在完全由Spring管理的环境中使用Spring的Context获取Bean实例

在大型的应用中,常常会有很灵活的需求,而在使用了框架之后,虽然可以大大提高开发的效率,但同时,也把我们框到一个架子中了. 下面先说一下我遇到的问题,事情大概是这样的: @Component @Scope("prototype") public class Action1 implements Action{ ..... } @Component @Scope("prototype") public class Action2 implements Action{ .

spring-如何在项目启动的情况下获取Bean实例

大家都知道,项目启动的时候,spring读取xml文件,将配置的bean 或者 注解下的controller service dao全部实例化.然后注入到代码里去使用.那么我们怎么自己去获取某个实例化的bean呢.自己new是没用的. 举个场景, 假设我写了一个类 public class A{ @Resource private static ADao aDao; static{   aDao.select(); } public static void getA(){  ... } } 当

Spring容器中获取bean实例的方法

// 得到上下文环境 WebApplicationContext webContext = ContextLoader .getCurrentWebApplicationContext(); // 使用上下文环境中的getBean方法得到bean实例 InhospDoctorStationController controller = (InhospDoctorStationController) webContext.getBean("inhospDoctorStationController

mvn中,使用spring中获取bean实例

由于spring官方的例子都是用maven进行代码管理, 我打算以后的代码也用maven进行管理. spring一个重要的优点就是Ioc,也就是控制反转,可以用xml文件来生成类的实例.我以前都是用eclipse下的tomcat方式来管理bean实例,用spring自带的spring tool suits管理还有点不习惯,不过生产工具都是不断优化的,所以这里也学着习惯使用. 配置文件可以放在resources文件夹下,具体目录为src\main\resources,src下的另一个文件是java

spring读取配置文件,且获取bean实例

import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.xml.XmlBeanFactory;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.context.support.FileSystemXmlApplica

[原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

【Spring源码分析】原型Bean实例化过程、byName与byType及FactoryBean获取Bean源码实现

原型Bean加载过程 之前的文章,分析了非懒加载的单例Bean整个加载过程,除了非懒加载的单例Bean之外,Spring中还有一种Bean就是原型(Prototype)的Bean,看一下定义方式: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi=&qu

使用反射创建Bean、Spring中是如何根据类名配置创建Bean实例、Java提供了Class类获取类别的字段和方法,包括构造方法

Java提供了Class类,可以通过编程方式获取类别的字段和方法,包括构造方法 获取Class类实例的方法: 类名.class 实例名.getClass() Class.forName(className) public class RefTest { @Test public void testRef(){ //Class cls = RefTest.class; //Class.forName("com.jboa.service.RefTest"); //new RefTest()

AM使用指南:如何在Managed Bean中获取AM实例?

AM是放置服务方法的地方,有时我们需要在Managed Bean中调用这些方法.要调用这些方法,首先要在Managed Bean中获取AM实例.这里要用到<ADF工具类:ADFUtil.java 源代码>. 1. 获取默认的AM实例如果Model项目中只有一个AM,可以这样获取:ApplicationModule am = ADFUtils.getDCBindingContainer().getDataControl().getApplicationModule(); 2. 获取指定的AM实例