最近项目中采用了springmvc框架作为控制层,关于如果在controller中获取spring容器中的bean实例,遇到了点问题。
很早以前的一个版本是有个静态工厂类加载了spring容器,具体代码如下:
private static BeanFactory beanFactory = null; static{ beanFactory =new ClassPathXmlApplicationContext("spring.xml"); } /** * 获取Bean对象 * @param pBeanID * @return */ public static Object getBean(String pBeanID) { return beanFactory.getBean(pBeanID); }
后来改用spring提供的ContextLoaderListener这一监听器,在WEB应用启动时初始化spring容器,具体在web.xml里配置如下:
<!-- 应用的Spring配置的加载 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/conf/spring.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
这个版本存在一个问题,我们项目中未在spring容器注册的类如果想调用容器中的bean实例,需要servletContext这一参数信息。
具体获取方法有两种:
ApplicationContext context= WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);
两者的区别是:第一种方法失败会抛异常,第二种返回null不做处理。
如果是没有servletContext的场景,难道又得回到最初的方法,维护个静态容器工厂!!
当然是有更好的方案,一样还是通过web.xml的监听器实现,在应用启动时初始化加载容器,并把它保存到静态变量中,具体代码和配置如下:
web.xml:
<!-- 保存spring容器,为spring容器外的类提供容器获取接口 --> <listener> <listener-class>com.rb.obs.face.common.util.SpringContextListener</listener-class> </listener>
监听器实现:
package com.rb.obs.face.common.util; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.springframework.context.ApplicationContext; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; public class SpringContextListener implements ServletContextListener { private static WebApplicationContext context; public SpringContextListener() { super(); } public void contextInitialized(ServletContextEvent sce) { // TODO Auto-generated method stub context = WebApplicationContextUtils.getWebApplicationContext(sce .getServletContext()); } public void contextDestroyed(ServletContextEvent sce) { // TODO Auto-generated method stub } public static ApplicationContext getApplicationContext() { return context; } }
获取容器:
ApplicationContext context = SpringContextListener.getApplicationContext()
相关推荐
"Spring Boot 容器加载完成后执行特定操作" Spring Boot 框架提供了多种方式来执行容器加载完成后的特定操作,例如使用 ApplicationListener 接口或使用 @PostConstruct 注解。在本文中,我们将介绍使用 ...
6. 添加获取Bean实例的方法,模拟Spring容器的getBean功能。 在标签中提到了“源码”和“工具”,这意味着博客可能会深入到Spring框架的源码层面,分析其内部实现机制,同时也可能介绍了一些辅助开发的工具,比如...
总的来说,Spring动态加载配置文件的实现涉及到文件监听、配置文件解析、应用上下文刷新以及Web容器的协同。通过这样的机制,开发者可以在开发阶段快速响应配置的更改,提高开发效率,同时降低生产环境因重启服务...
本主题将深入探讨“简单Spring容器实现”,基于提供的标签“源码”和“工具”,我们将聚焦于Spring容器的原理及其简易实现。下面,我们先来理解Spring容器的核心概念,然后逐步探索其内部机制,并通过一个名为...
然而,在某些情况下,我们可能需要在非Spring注解的类中访问Spring容器中的Bean,或者在这些类中使用YAML配置文件中的配置信息。本篇将详细介绍如何在这样的场景下实现这一目标。 首先,让我们来理解如何在非Spring...
基于接口、抽象类实现不停机动态调整代码的目的,将修改后的源码文件放置于指定目录下,读取文件后执行动态编译方法,即可将该类重新加载,新的类可以在Spring容器从新注册,且仅在当前窗口生效。如果重启了服务或...
Spring容器还提供了多种管理Bean生命周期的方法,包括初始化回调、销毁回调、以及作用域(singleton、prototype等)。初始化回调是指在Bean实例化后、开始使用前执行的方法,可以通过`init-method`属性指定。销毁回...
Spring容器是Spring框架的核心组成部分,它负责管理对象的生命周期和对象之间的依赖关系。Spring容器的主要职责是读取配置元数据,创建和组装Bean,并提供Bean的完整生命周期管理。本篇内容将深入探讨Spring容器的...
然后,我们调用父类 AbstractApplicationContext 的 refresh() 方法,该方法采用模板方法的设计模式将加载 IoC 容器的流程列于其中。具体调用到的方法由其子类进行覆盖。 3. 加载 BeanFactory 在 ...
本实例将带你深入理解Spring容器的基本使用,通过实际操作来帮助你快速上手。 1. **Spring容器概述** Spring容器是Spring框架的核心,负责管理对象的生命周期和依赖关系。主要有两种类型的容器:BeanFactory和...
Spring Boot 容器加载时执行特定操作 Spring Boot 框架提供了多种方式来执行容器加载时的特定操作。其中一种方式是通过实现 ApplicationListener 接口,并指定相应的事件来执行操作。 ApplicationListener 接口是 ...
Spring Bean 加载过程源码解析文档 Spring Bean 加载过程是 Spring 框架中最核心的部分之一,涉及到 ApplicationContext 的初始化、Bean 的加载和注册等过程。在 Spring Boot 应用程序中,SpringApplication 负责...
该接口只有一个方法`postProcessBeanFactory`,该方法在容器加载完成之后被调用,可以用来改变容器中的配置或做一些初始化工作。 ```java public interface BeanFactoryPostProcessor { void ...
3. **IoC(控制反转)与DI(依赖注入)**:在Spring中,bean的创建和初始化由Spring容器控制,这就是所谓的控制反转。依赖注入则是通过容器将bean所需的服务或对象传递给它,而不是由bean自己去查找。这大大提高了...
首先,Spring容器在启动时会读取配置文件(如XML或Java配置类),根据配置信息创建Bean的定义。Bean的定义包含了Bean的类、属性、依赖关系等信息。 ### Bean的实例化 1. **构造器注入**:当Spring创建Bean时,如果...
SpringBoot如何在普通类加载Spring容器 SpringBoot作为一个流行的Java框架,提供了很多便捷的方式来加载和管理Bean。然而,在某些情况下,我们可能需要在普通类中使用Spring容器中的Bean。在本文中,我们将介绍如何...
Spring 简单容器中的 Bean 基本加载过程 Spring 框架是 Java 企业级应用程序的核心框架之一,它提供了一个 IOC(Inverse of Control,控制反转)容器,用于管理应用程序中的对象。Spring IOC 容器的核心是 ...
### Struts加载Spring的方法 在Java Web开发领域中,Struts与Spring是两个非常重要的框架。Struts主要用于构建MVC架构的应用程序,而Spring则是一个轻量级的控制反转(Inversion of Control, IoC)容器,同时也提供...
SpringSecurity加载流程图 SpringSecurity系统启动流程 SpringSecurity调用流程