ServletContext,是一个全局的储存信息的空间,服务器开始建立,服务器关闭销毁。
request,每次请求一个;
session,一个会话一个;
servletContext,所有用户共用一个。
ServletContext维护着一个服务器中的一个特定URL名字空间(比如,/myapplication)下的所有Servlet,Filter,JSP,JavaBean等Web部件的集合。也就是说Servlet和Filter并不是由Spring ApplicationContext维护的,所以使用@Autowired注解在调用时会NPE。
方法一
在filter类init中强制注册@Autowired
override fun init(filterConfig: FilterConfig?) {
SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, filterConfig?.servletContext)
}
方法二,不能直接使用@Autowired
在主类中加载
@Import(WebApplicationContextHolder::class)
class WebApplicationContextHolder : ServletContextInitializer {
companion object {
var currentWebApplicationContext: WebApplicationContext? = null
private set
}
/**
* 在启动时将servletContext 获取出来,后面再读取二次使用。
* @param servletContext
* *
* *
* @throws ServletException
*/
@Throws(ServletException::class)
override fun onStartup(servletContext: ServletContext) {
currentWebApplicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext)
}
}
filter中 将想要注解的bean拿到
//先定义,在init中赋值
var appService:ExternalAppService?=null
·······
override fun init(filterConfig: FilterConfig?) {
// SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, filterConfig?.servletContext)
appService=WebApplicationContextHolder.currentWebApplicationContext?.getBean(ExternalAppService::class.java)
}