清楚地了解如何在上下文之间访问 bean
spring 中有两种上下文
1. 根上下文(Context's Loaded by ContextLoaderListener)
2.Servlet上下文(上下文由DispatcherServlet加载)
在 rootContext 中定义的 bean 在 servletContext 中是否可见? - 是的
默认情况下,在根上下文中定义的 Bean 在所有 servlet 上下文中始终可见。例如,在根上下文中定义的 dataSource bean 可以在 servlet 上下文中访问,如下所示。
@Configuration
public class RootConfiguration
{
@Bean
public DataSource dataSource()
{
...
}
}
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.pvn.mvctiles")
public class ServletConfiguration implements WebMvcConfigurer
{
@Autowired
private DataSource dataSource;
...
}
在 servletContext 中定义的 bean 在 rootContext 中是否可见 - 是*
(为什么 * 在是)
1.上下文顺序的初始化是先rootContext,后是servletContext。
在 rootContext 初始化期间,即在根上下文配置类/xml 中,如果您尝试获取在 servletContext 中定义的 bean,您将获得 NULL。 (因为 servletContext 尚未初始化,因此我们可以说 bean 在 rootContext 初始化期间不可见/未注册)
但是可以在 servletContext 初始化后获取 servletContext 中定义的 bean(可以通过应用上下文获取 bean)
您可以通过
打印并确认
applicationContext.getBeanDefinitionNames();
2. 如果要在过滤器或另一个 servlet 上下文中访问 servlet 上下文的 bean,请将 "org.springframework.web.servlet" 基本包添加到您的根配置类/xml
@Configuration
@ComponentScan(basePackages = "org.springframework.web.servlet" )
public class RootConfiguration
添加后,您可以从应用程序上下文中获取以下所有 bean
springSecurityConfig, tilesConfigurer, themeSource, themeResolver, messageSource, localeResolver, requestMappingHandlerMapping, mvcPathMatcher, mvcUrlPathHelper, beanNameHandlerMapping, @98654336@, @987654336 ,resourceHandlerMapping,mvcResourceUrlProvider,defaultServletHandlerMapping,requestMappingHandlerAdapter,mvcConversionService,mvcValidator,mvcUriComponentsContributor,httpRequestHandlerAdapter,httpRequestHandlerAdapter,simpleControllerHandlerAdapter,mvcViewResolver,mvcViewResolver,mvcViewResolver,mvcViewResolver p>
如果您想在 rootContext 中获取自定义 bean,请将基本包值添加到 rootContext 组件扫描,如下所示。
@Configuration
@ComponentScan(basePackages = { "com.your.configuration.package", "org.springframework.web.servlet" })
public class RootConfiguration
如果您希望注入的依赖项在您的 rootContext 中可用并且可以在您的 servlet-filter 中访问,上述配置将很有帮助。例如,如果您在过滤器中捕获异常并希望发送与HttpMessageConverter 发送的响应相同但在 servletContext 中配置的错误响应,那么您可能希望访问该配置的转换器以发送相同的响应。
注意这一点,下面的自动装配在 servlet-filters 中不起作用
@Autowired
private ApplicationContext appContext;
ApplicationContext 自动装配在 servlet 过滤器中不起作用,因为过滤器是在 spring 容器初始化之前初始化的。(取决于您的过滤器和 DelegatingProxyFilter 的顺序)
所以,要在过滤器中获取 applicationContext
public class YourFilter implements Filter
{
private ApplicationContext appContext;
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
Filter.super.init(filterConfig);
appContext = WebApplicationContextUtils.getRequiredWebApplicationContext(filterConfig.getServletContext());
}
}
希望它能清楚地说明如何在上下文之间访问 bean。