spring-boot学习:十六、spring-boot获取ApplicationContext上下文

很多时候我们希望直接获取spring容器中管理的bean,则可以通过上下文ApplicationContext来获取,哪如何获取ApplicationContext呢?

以下几种方式,根据需要选用:
1.实现接口ServletContextListener,并实现接口需要实现的方法,使用@WebListener与@ServletComponentScan进行注册

public void contextInitialized(ServletContextEvent sce) {
	ApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(sce.getServletContext());
}

2.实现接口ApplicationContextAware,并使用@Component注解,推荐使用该方式,可以支持web和非web

@Component
public class SpringBootApplicationContextLoader implements ApplicationContextAware{

	private static ApplicationContext applicationContext;
	
	@Override
	public void setApplicationContext(ApplicationContext context) throws BeansException {
		applicationContext = context;
	}
	
	public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
}

3.结合使用

package com.kevin.core.support;

import java.lang.annotation.Annotation;
import java.util.Map;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.web.context.support.WebApplicationContextUtils;

/**
 * Spring Bean加载类
 * 
 * ServletContextListener监听ServletContext的生命周期,也就是相当于用来监听Web应用的生命周期
 * 与Servlet, Filter和其他listener用法一样
 * 使用@WebListener与@ServletComponentScan进行注册
 * 可参考https://docs.spring.io/spring-boot/docs/1.5.2.RELEASE/reference/htmlsingle/
 * 
 * @author kevin
 *
 */
@WebListener
public class SpringContextLoader implements ApplicationContextAware, ServletContextListener {

	private final static Logger logger = LoggerFactory.getLogger(SpringContextLoader.class);

	private static ApplicationContext applicationContext = null;
	
	@Override
	public void setApplicationContext(ApplicationContext context) throws BeansException {
		applicationContext = context;
	}

	public void contextInitialized(ServletContextEvent sce) {

		// 装载Spring的Context
		try {
			if(applicationContext==null) {
				applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(sce.getServletContext());
			}
			logger.info("系统spring配置装载成功~");
		} catch (Exception e) {
			logger.error("系统spring配置装载失败", e);
		}
	}

	public void contextDestroyed(ServletContextEvent sce) {
		try {
			// 卸载Spring的Context
			applicationContext = null;
			logger.info("系统spring配置卸载成功~");
		} catch (Exception e) {
			logger.error("系统spring配置卸载失败", e);
		}
	}

	public static void setSpringContext(ApplicationContext applicationContext) {
		SpringContextLoader.applicationContext = applicationContext;
	}

	public static ApplicationContext getApplicationContext() {
		return applicationContext;
	}

	// ---------------------------------------------------

	/**
	 * 通过对象名,得到spring管理的对象
	 * 
	 * @param beanName
	 *            对象名
	 * @return
	 */
	public static Object getBean(String beanName) {

		if (!getApplicationContext().containsBean(beanName)) {

			// 第一位如果是小写就大写,如果大写就小写
			if (!beanName.substring(0, 1).toLowerCase().equals(beanName.substring(0, 1))) {
				beanName = beanName.substring(0, 1).toLowerCase() + beanName.substring(1);
			} else if (!beanName.substring(0, 1).toUpperCase().equals(beanName.substring(0, 1))) {
				beanName = beanName.substring(0, 1).toUpperCase() + beanName.substring(1);
			}
		}

		return getApplicationContext().getBean(beanName);
	}

	@SuppressWarnings("unchecked")
	public static <T> T getBean(String beanName, Class<T> clazz) {
		return (T) SpringContextLoader.getBean(beanName);
	}

	public static <T> T getBean(Class<T> clazz) {
		String[] beans = getApplicationContext().getBeanNamesForType(clazz);
		if (beans != null && beans.length > 0) {
			return getBean(beans[0], clazz);
		}
		return null;
	}

	/**
	 * 通过注解得到类型
	 * 
	 * @param clazz
	 * @return
	 */
	public static Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> clazz) {
		return getApplicationContext().getBeansWithAnnotation(clazz);

	}
}

猜你喜欢

转载自blog.csdn.net/guangcaiwudong/article/details/107927432