Spring上下文对象

本文介绍了一种在非Spring容器管理的对象中获取Spring Bean的方法,通过实现ApplicationContextAware接口并提供一系列工具方法来简化Bean的获取过程。这些方法包括根据名称获取Bean、按类型获取Bean的集合等。

接上一篇,如果没有Servlet代理类,而又想在Servlet(或其他非同一Spring容器管理的对象)中获取目标bean,可以实现接口org.springframework.context.ApplicationContextAware,然后将实现类作为bean,然后可以正常使用,一般是将常用的getBean、getBeansOfType等包装成类方法,一是方便作为工具方法调用,二来可以自己捕获异常,再抛出项目中的指定异常。实际上,ApplicationContextAware的类型层次结构中,有一个实现类org.springframework.context.support.ApplicationObjectSupport,并整合了MessageSourceAccessor很方便。代码如下:


package com.xxx.context;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.MapUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ApplicationObjectSupport;
import org.springframework.context.support.MessageSourceAccessor;
import org.springframework.util.Assert;

import xxx.xxx.BusinessException;


/**
 *  Spring上下文<br>
**/
public class SpringContext extends ApplicationObjectSupport implements InitializingBean {

 /** 当前上下文 */
 private static ApplicationContext context = null;
 /** 消息存取器 */
 private static MessageSourceAccessor messageSourceAccessor = null;


 @Override
 public void afterPropertiesSet() throws Exception {
  context = super.getApplicationContext();
  messageSourceAccessor = new MessageSourceAccessor(context);
  Assert.notNull(context, "ApplicationContext不能为空!");
  Assert.notNull(messageSourceAccessor, "messageSourceAccessor不能为空!");
 }


 /**
  * 根据名称获取Bean
  *
  * @param beanName
  * @return
  */
 public static Object getBean(String beanName) throws BusinessException {
  try {
   return context.getBean(beanName);
  }
  catch (Exception e) {
   throw new BusinessException("", e);
  }
 }


 /**
  * 根据类型获取Bean Map
  *
  * @param type
  * @return
  */
 public static <T> Map<String, T> getBeanMapOfType(Class<T> type) throws BusinessException {
  try {
   return context.getBeansOfType(type);
  }
  catch (Exception e) {
   throw new BusinessException("", e);
  }
 }


 /**
  * 根据类型获取Bean List
  *
  * @param type
  * @return
  */
 public static <T> List<T> getBeanListOfType(Class<T> type) throws BusinessException {
  Map<String, T> beanMap = getBeanMapOfType(type);
  List<T> list = new ArrayList<T>();
  if (MapUtils.isNotEmpty(beanMap)) {
   list.addAll(beanMap.values());
  }
  return list;
 }


 /**
  * 根据类型获取Bean Array
  *
  * @param type
  * @return
  */
 public static <T> T[] getBeanArrayOfType(Class<T> type) throws BusinessException {
  List<T> list = getBeanListOfType(type);
  @SuppressWarnings("unchecked")
  T[] array = (T[]) Array.newInstance(type, list.size());
  array = list.toArray(array);
  return array;
 }


 /**
  * 获取国际化消息
  *
  * @param code
  *              消息代码
  * @return
  */
 public static String getMessage(String code) throws BusinessException {
  try {
   return messageSourceAccessor.getMessage(code);
  }
  catch (Exception e) {
   throw new BusinessException("", e);
  }
 }

}

 

### Spring框架中上下文对象(ApplicationContext)的作用及使用方法 Spring框架中的`ApplicationContext`是Spring容器的一种高级接口,用于维护Bean定义以及对象之间的协作关系[^4]。它不仅是一个容器,还提供了许多附加功能,例如国际化支持、事件传播机制和资源加载等。 #### 1. ApplicationContext的作用 `ApplicationContext`的主要作用包括: - **Bean管理**:负责创建、配置和管理Bean的生命周期。 - **依赖注入**:通过构造函数、Setter方法或字段注入实现Bean之间的依赖关系。 - **事件传播**:支持事件监听器机制,允许开发者在特定事件发生时执行自定义逻辑。 - **国际化支持**:提供对多语言环境的支持,便于开发国际化应用程序。 - **资源加载**:能够加载文件、URL或其他类型的资源。 #### 2. 使用方法 以下是几种常见的获取和使用`ApplicationContext`的方法: - **通过抽象类`ApplicationObjectSupport`获取** 抽象类`ApplicationObjectSupport`提供了一个`getApplicationContext()`方法,可以方便地获取`ApplicationContext`实例。Spring初始化时,会通过`setApplicationContext(ApplicationContext context)`方法将`ApplicationContext`对象注入到该类中[^1]。 - **通过实现`ApplicationContextAware`接口** 开发者可以通过实现`ApplicationContextAware`接口并重写`setApplicationContext(ApplicationContext applicationContext)`方法来获取`ApplicationContext`实例。例如: ```java import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class MyBean implements ApplicationContextAware { private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } public void doSomething() { // 使用applicationContext进行操作 } } ``` - **通过主类手动创建** 在Java程序中,可以通过`ClassPathXmlApplicationContext`或`AnnotationConfigApplicationContext`等类手动创建`ApplicationContext`实例。例如: ```java import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainApp { public static void main(String[] args) { ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // 使用context获取Bean实例 MyBean myBean = (MyBean) context.getBean("myBean"); myBean.doSomething(); context.close(); } } ``` - **通过Web应用配置** 在Web应用中,`WebApplicationContext`是`ApplicationContext`的子接口,通常由`ContextLoaderListener`或`DispatcherServlet`自动创建并初始化。`web.xml`文件中的`contextConfigLocation`参数会被设置到Spring应用上下文中[^2]。 #### 3. 示例代码 以下是一个简单的示例,展示如何通过`ClassPathXmlApplicationContext`创建`ApplicationContext`并获取Bean: ```java import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class EventExample { public static void main(String[] args) { // 创建ApplicationContext实例 ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // 获取Bean实例 MyBean myBean = (MyBean) context.getBean("myBean"); // 调用Bean方法 myBean.doSomething(); // 关闭应用上下文 context.close(); } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值