很多时候我们希望直接获取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);
}
}