欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

基于Spring上下文工具类 ApplicationContextUtil

程序员文章站 2022-07-02 08:52:57
目录spring上下文工具类 applicationcontextutil获取applicationcontext的工具类方式一方式二方式三方式四方式五spring上下文工具类 application...

spring上下文工具类 applicationcontextutil

import org.springframework.beans.beansexception;
import org.springframework.context.applicationcontext;
import org.springframework.context.applicationcontextaware;
import org.springframework.stereotype.component;
 
/**
 * spring 上下文工具类
 * @author dawn
 */
@component
public class applicationcontextutil implements applicationcontextaware {
 
    /**
     * 上下文对象实例
     */
    private static applicationcontext applicationcontext;
 
    @override
    public void setapplicationcontext(applicationcontext applicationcontext) throws beansexception {
        applicationcontextutil.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);
    }
}

获取applicationcontext的工具类

在项目中,经常遇到这样的问题:

有些类需要使用new来创建对象,但是类中需要使用spring容器中定义的bean,此时无法通过spring的自动注入来注入我们需要使用的bean。

所以需要手动的从spring容器中获取bean。要获取bean必须先获取到applicationcontext对象,有以下方式可以获取该对象。

方式一

手动创建applicationcontext对象,并保存起来。

public class applicationcontextutil {
    private static applicationcontext context;
    static {
        context = new classpathxmlapplicationcontext("applicationcontext.xml");
    }
    public static applicationcontext getapplicationcontext() {
        return context;
    }
}

方式二

在web环境中通过spring提供的工具类获取,需要servletcontext对象作为参数。然后才通过applicationcontext对象获取bean。

下面两个工具方式的区别是,前者在获取失败时返回null,后者抛出异常。

另外,由于spring是容器的对象放在servletcontext中的,所以可以直接在servletcontext取出 webapplicationcontext 对象。

applicationcontext context1 = webapplicationcontextutils.getwebapplicationcontext(servletcontext sc);
applicationcontext context2 = webapplicationcontextutils.getrequiredwebapplicationcontext(servletcontext sc);
webapplicationcontext webapplicationcontext = (webapplicationcontext) servletcontext.getattribute(webapplicationcontext.root_web_application_context_attribute);

方式三

工具类继承抽象类applicationobjectsupport,并在工具类上使用@component交由spring管理。

这样spring容器在启动的时候,会通过父类 applicationobjectsupport中的setapplicationcontext()方法将applicationcontext对象设置进去。

可以通过getapplicationcontext()得到applicationcontext对象。

方式四

工具类继承抽象类webapplicationobjectsupport,查看源码可知webapplicationobjectsupport是继承了applicationobjectsupport,所以获取applicationcontext对象的方式和上面一样,也是使用getapplicationcontext()方法。

方式五

工具类实现applicationcontextaware接口,并重写setapplicationcontext(applicationcontext applicationcontext)方法,在工具类中使用@component注解让spring进行管理。

spring容器在启动的时候,会调用setapplicationcontext()方法将applicationcontext 对象设置进去。

@component
public class applicationcontextutil implements applicationcontextaware {
    private static applicationcontext context;
    public void setapplicationcontext(applicationcontext applicationcontext) throws beansexception {
        context = applicationcontext;
    }
    public static applicationcontext getapplicationcontext() {
        return context;
    }
}

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