使用spring技术的web应用中,如何在程序中获取Spring上下文ApplicationContext,有两种方式:
1:实现ApplicationContextAware接口(实现此接口的setApplicationContext方法),在web应用中,spring会在启动时加载springContext上下文,spring的配置文件中配置了<context:component-scan/>会扫描配置了@Component注解的类,当扫描到实现了ApplicationContextAware接口的类时,spring启动线程会自动调用此类中的setApplicationContext方法,这样就可以将spring上下文注入到此类中的成员变量中(假设此变量的名称为applicationContext)。
使用main方法测试此类时,可以使用ClassPathXmlApplicationContext的构造器去加载spring上下文,然后让spring的启动线程去走完上述流程。web.xml的加载顺序是context-param->Listener(一般这里配置的spring的Listener接口即ContextLoaderListener)->filter->servlet(springmvc作为第一个Servlet加载),先加载tomcat中的ServletContext,再加载spring上下文,再加载springmvc上下文。spring的加载配置文件的机制:在web.xml中配置listen-class:org.springframework.web.context.ContextLoaderListener,此类是spring容器的入口,此接口有contextInitialized方法(初始化 root web application context)和contextDestroyed方法(销毁the root web application context).在项目启动时在ContextLoader的initWebApplicationContext的方法中打断点,此时的servletContext对象中的context是org.apache.catalina.core.ApplicationContext,继续走是使用WebappClassLoader去加载XmlWebApplicationContext上下文,继续走到BeanUtils.instantiateClass方法中使用clazz.getDeclaredConstructor()来获取一个默认构造器,后面过程略过。
@Component public class SpringContextHolder implements ApplicationContextAware { private static ApplicationContext applicationContext; private volatile static int i = 0 ; // 实现ApplicationContextAware接口的context注入函数, 将其存入静态变量. public synchronized void setApplicationContext(ApplicationContext applicationContext) { System.out.println("i : " + (++i)); SpringContextHolder.applicationContext = applicationContext; } // 取得存储在静态变量中的ApplicationContext. public static ApplicationContext getApplicationContext() { checkApplicationContext(); return applicationContext; } // 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型. @SuppressWarnings("unchecked") public static <T> T getBean(String name) { checkApplicationContext(); return (T) applicationContext.getBean(name); } public static Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) { checkApplicationContext(); return applicationContext.getBeansWithAnnotation(annotationType); } // 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型. // 如果有多个Bean符合Class, 取出第一个. @SuppressWarnings("unchecked") public static <T> T getBean(Class<T> clazz) { checkApplicationContext(); @SuppressWarnings("rawtypes") Map beanMaps = applicationContext.getBeansOfType(clazz); if (beanMaps != null && !beanMaps.isEmpty()) { return (T) beanMaps.values().iterator().next(); } else { return null; } } public static <T> Map<String, T> getBeanMap(Class<T> clazz) { checkApplicationContext(); return applicationContext.getBeansOfType(clazz); } private static void checkApplicationContext() { if (applicationContext == null) { throw new IllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextHolder"); } } public static void main(String[] args) { applicationContext = new ClassPathXmlApplicationContext("cfg-spring/spring-application.xml"); Map<String, Object> map = SpringContextHolder.getBeansWithAnnotation(InitService.class); Iterator<Map.Entry<String, Object>> iter = map.entrySet().iterator(); while(iter.hasNext()){ Entry<String, Object> next = iter.next(); System.out.println(next.getKey() + " : " + next.getValue()); } }
2:继承ApplicationObjectSupport(直接在当前类中使用this.getApplicationContext())
例如:Map<String, Object> map = this.getApplicationContext().getBeansWithAnnotation(InitService.class) 直接中map中获取对应注解(InitService)值的class
相关推荐
通过Spring上下文获取bean的实例对象
Spring 应用上下文获取 Bean 是一个常见的操作,在 Spring 框架中获取 Bean 对象是非常重要的。本文将总结 Spring 应用上下文获取 Bean 的常用姿势实例,并对其实现方法和操作注意事项进行详细的分析和讲解。 一、...
Spring Boot 使用上下文获取 Bean 在 Spring Boot 项目中,有时候需要在 Spring 容器加载前就注入 Bean,这时候如果直接使用 @Autowire 注解,将会出现控制针异常。为了解决这个问题,我们可以创建一个 ...
在提交任务时,可以将bean作为参数传递,或者在任务内部使用`ApplicationContextAware`接口获取应用上下文,从而获取bean。 4. **ApplicationContextAware**:让线程处理类实现`ApplicationContextAware`接口,...
在Spring MVC和Spring框架的整合应用中,常常会遇到两套上下文的问题。Spring MVC是Spring框架的一个模块,主要用于处理Web请求,而Spring则提供了一个更广泛的IoC(Inversion of Control,控制反转)和AOP(Aspect ...
在Spring框架中,Spring Context上下文是核心组件之一,它为开发者提供了强大的依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IoC)功能。本篇文章将深入探讨如何利用Spring ...
`BeanFactoryAware`接口使得Bean可以被注入`BeanFactory`,而`ApplicationListener`接口则可以让Bean监听到应用上下文的刷新事件,从而在合适的时机执行动态注册逻辑。 ```java public class BeanFactoryAwareBean ...
然而,在某些情况下,我们可能需要在非Spring注解的类中访问Spring容器中的Bean,或者在这些类中使用YAML配置文件中的配置信息。本篇将详细介绍如何在这样的场景下实现这一目标。 首先,让我们来理解如何在非Spring...
在Servlet中,我们可以利用`WebApplicationContextUtils`工具类来获取当前Servlet上下文(ServletContext)中的WebApplicationContext。这是一个静态方法,如下所示: ```java ApplicationContext context = ...
在`doCreateBean()`方法中,Spring会创建Bean的实例,`createBeanInstance(beanName, mbd, args)`执行Bean实例的创建,而`populateBean(beanName, mbd, instanceWrapper)`则负责填充Bean的属性,将依赖注入到Bean中...
在 Java 应用中使用 Spring,我们需要创建一个 Spring 上下文(ApplicationContext)来加载 Bean 的定义。这个上下文将负责创建和管理 Bean,以及执行依赖注入。通常,我们可以使用 `ClassPathXmlApplicationContext...
在Spring框架中,ApplicationContext是应用的核心,它管理着所有Bean的生命周期。本章将深入探讨Spring应用上下文的生命周期,从启动准备阶段到关闭阶段,包括各个关键步骤和相关组件的作用。 1. **Spring 应用上...
4. **Spring的应用上下文(ApplicationContext)**:ApplicationContext是Spring的主要接口之一,它提供了获取Bean、处理消息和事件等功能,是Spring应用中的主要入口点。 5. **构造注入(constructor injection)*...
2. `AsyncProxyBeanPostProcessor`:此处理器可能用于创建代理对象,确保异步初始化方法在正确的上下文中执行。代理对象能够拦截调用并将其转换为异步操作。 3. `BeanDefinitionUtil`:这个工具类可能包含了对bean...
1. **ApplicationContext**:这是Spring提供的一个接口,代表了Spring的上下文,包含了bean的定义和bean的实例。我们可以使用`ApplicationContext`来获取bean。例如: ```java ApplicationContext context = new ...
6. **Bean的作用域**:默认情况下,Spring Bean的作用域是Singleton,意味着在整个应用上下文中只有一个实例。如果将Bean设置为Prototype,那么每次请求都会创建一个新的实例,可能导致重复执行。 7. **XML配置中的...
这通常涉及到Spring的代理机制、AOP的切面定义、方法调用上下文以及EL的语法和功能。 Spring AOP是Spring框架的一个重要特性,它允许开发者创建具有横切关注点的模块,如日志记录、事务管理等。这些关注点可以被...
ApplicationContextInitializer 是 Spring 上下文初始化类,负责加载配置文件和注册 Bean。通过查看源码,我们可以发现 Spring 自动加载配置文件的代码。 SpringApplication 运行 SpringApplication 的 run 方法是...
这将创建一个上下文,其中包含配置文件中定义的所有bean。 5. **获取bean对象**: 一旦有了ApplicationContext,就可以通过bean的ID获取bean对象: ```java MyBean myBean = (MyBean) context.getBean(...
首先,我们需要在类中定义一个 WebApplicationContext 变量,以便获取应用程序的上下文环境变量。然后,我们可以使用 ctx.getBean() 方法来获取指定名称的 Bean 对象。 ```java public class BaseDispatchAction ...