应用上下文工具类(ApplicationContextUtil)

该类可以帮助我们获取得到Spring容器中的Bean。

package com.dyw.shirospringboot.utils;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
* @author Devil
* @since 2022-07-03-14:24
*
* 该工具类主要是用于那些没有被Spring容器管理的类来使用Spring管理的Bean的
*/
@Component
public class ApplicationContextUtil implements ApplicationContextAware {

private static ApplicationContext applicationContext;

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ApplicationContextUtil.applicationContext = applicationContext;
}

/**
* 获取applicationContext
*
* @return Context
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}

/**
* 通过name获取Bean.
*
* @param name 名称
* @return bean
*/
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}

/**
* 通过class获取Bean.
*
* @param clazz
* @return Bean
*/
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}

/**
* 通过name,以及Clazz返回指定的Bean
*
* @param name 名称
* @param clazz 类
* @return Bean
*/
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}

原理

实现了ApplicationContextAware接口,实现void setApplicationContext(ApplicationContext applicationContext) throws BeansException;方法

setApplicationContext方法会在初始化对象的的时候调用,这时Spring会将ApplicationContext(即Spring的IOC容器)注入该对象,通过该方法接收。

接收到之后我们就可以通过这个容器对象按需取出里面的Bean了。

适用范围

当我们正在使用的类并没有被带上加入如@Component@Service等注解时,我们的类的生命周期是不受Spring容器管理的,这时我们的类中配置的各种以便于Spring注入的注解是不会生效的。所以这时我们需要一个可以帮助我们从Spring容器中手动获取Bean的工具类。