需求: 创建一个工具类,可以根据beanId获取spring的bean对象.
方法 一 : 配置监听器,实现ServletContextListener接口
1.在web.xml配置监听器
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<listener>
<listener-class>
com.demo.utils.SpringBeanGetter
</listener-class>
</listener>
2.创建监听器实现类,实现ServletContextListener
public class SpringBeanGetter implements ServletContextListener
{
public SpringBeanGetter()
{
}
public void contextDestroyed(ServletContextEvent arg0)
{
setContext(null);
}
public void contextInitialized(ServletContextEvent arg0)
{
setContext(arg0.getServletContext());
}
private static final void setContext(ServletContext context)
{
context = context;
}
public static final Object getBean(String beanId)
{
WebApplicationContext application;
for(application = WebApplicationContextUtils.getWebApplicationContext(context); application == null && errorCount < 5;)
try
{
Thread.currentThread();
Thread.sleep(3000L);
application = WebApplicationContextUtils.getWebApplicationContext(context);
logger.error(" \u672A\u627E\u5230applicationContext \u5BF9\u8C61");
errorCount++;
}
catch(InterruptedException e)
{
e.printStackTrace();
}
if(null != application)
return application.getBean(beanId);
else
return null;
}
private static ServletContext context = null;
private static final Logger logger = Logger.getLogger(com/huawei/ecommerce/common/base/utils/SpringBeanGetter);
private static int errorCount = 0;
}
方法 二 : 实现ServletContextListener接口
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException {
SpringUtils.applicationContext = applicationContext;
}
public static <T> T getBean(Class<T> type) {
try {
return Optional.ofNullable(applicationContext).orElseThrow(() -> new IllegalStateException("non in spring application context.")).getBean(type);
} catch (Exception e) {
return null;
}
}
}