`
wx1569578408
  • 浏览: 71631 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

spring getbean 方法分析

 
阅读更多

在最近的项目中,有个地方我们不得不实用getBean的方法,自己从Spring context中获取bean进行数据库操作。

方法一(效率低,极易出现bug,不推荐使用):

刚刚开始的时候,我们使用这中方式,但是在应用过程中发现此方式效率低下,而且极易出现bug。 在我们系统中会生成ehcache_auto_created_时间戳文件夹,

<!-- lang: java -->
String[] xmlCfg = new String[] {"classpath:/spring/applicationContext-service.xml",
			"classpath:/spring/applicationContext-util.xml",
			"classpath:/spring/applicationContext.xml"}; 
ApplicationContext context  = new FileSystemXmlApplicationContext(xmlCfg);
// 获取inspectionUtil bean
inspectionUtil = (InspectionUtil) context.getBean("inspectionUtil");

所以我google了一下,改用其他方法。

方法二(效率高,灵活性高,可复用,推荐使用): 创建一个工具类SpringContextsUtil ,通过实现Spring中的ApplicationContextAware接口,在applicationContext.xml中注入bean后Spring会自动调用setApplicationContext方法。此时我们就可以获取到Spring context。

<!-- lang: java -->
public class SpringContextsUtil implements ApplicationContextAware{

private static ApplicationContext applicationContext;    //Spring应用上下文环境   
  /**
  * 实现ApplicationContextAware接口的回调方法,设置上下文环境  
  * @param applicationContext
  * @throws BeansException
  */
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    SpringContextsUtil.applicationContext = applicationContext;
  }
 
  /**
  * @return ApplicationContext
  */
  public static ApplicationContext getApplicationContext() {
    return applicationContext;
  }
 
  /**
  * 获取对象  
  * @param name
  * @return Object 一个以所给名字注册的bean的实例
  * @throws BeansException
  */
  public static Object getBean(String name) throws BeansException {
    return applicationContext.getBean(name);
  }
 
  /**
  * 获取类型为requiredType的对象
  * 如果bean不能被类型转换,相应的异常将会被抛出(BeanNotOfRequiredTypeException)
  * @param name       bean注册名
  * @param requiredType 返回对象类型
  * @return Object 返回requiredType类型对象
  * @throws BeansException
  */
  public static Object getBean(String name, Class requiredType) throws BeansException {
    return applicationContext.getBean(name, requiredType);
  }
 
  /**
  * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
  * @param name
  * @return boolean
  */
  public static boolean containsBean(String name) {
    return applicationContext.containsBean(name);
  }
 
  /**
  * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。
  * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)  
  * @param name
  * @return boolean
  * @throws NoSuchBeanDefinitionException
  */
  public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
    return applicationContext.isSingleton(name);
  }
 
  /**
  * @param name
  * @return Class 注册对象的类型
  * @throws NoSuchBeanDefinitionException
  */
  public static Class getType(String name) throws NoSuchBeanDefinitionException {
    return applicationContext.getType(name);
  }
 
  /**
  * 如果给定的bean名字在bean定义中有别名,则返回这些别名  
  * @param name
  * @return
  * @throws NoSuchBeanDefinitionException
  */
  public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
    return applicationContext.getAliases(name);
  }
}

调用方法:

<!-- lang: java -->
// 获取inspectionUtil bean
inspectionUtil = (InspectionUtil) SpringContextUtil.getBean("inspectionUtil");

注:

1、使用时会出现无法获取applicationContext,并抛出NullPointerException。 原因:使用此方法必须在spring applicationContext.xml中注入bean。否则spring无法自动调用setApplicationContext。如下

<!-- lang: xml -->
<bean id="springContextsUtil" class="com.sinosoft.sepmis.util.SpringContextsUtil" ></bean>

2、如果注入后仍然出现这个问题。 则修改<beans default-autowire="byName" default-lazy-init="true">中的default-lazy-init="false"。 或者是修改bean注入属性

<!-- lang: xml -->
<bean id="springContextsUtil" class="com.sinosoft.sepmis.util.SpringContextsUtil" lazy-init="false"></bean>

转载于:https://my.oschina.net/u/225084/blog/167842

分享到:
评论

相关推荐

    Spring源码分析.pdf

    Spring 源码分析 Spring 框架是 Java 语言中最流行的开源框架之一,它提供了一个强大且灵活的基础设施来构建企业级应用程序。在 Spring 框架中,IOC 容器扮演着核心角色,本文将深入分析 Spring 源码,了解 IOC ...

    spring static静态方法里面注入bean空指针解决

    这里我们分析两种解决这个问题的方法。 首先,让我们深入理解问题的原因。在Spring中,`@Autowired`注解用于自动装配Bean,它依赖于Spring容器来扫描和管理Bean。然而,静态方法和静态变量不参与Spring的生命周期...

    springAOP核心组件分析.pdf

    在该方法中,会调用BeanFactory的getBean()方法来创建BeanPostProcessor的实例。 5)AnnotationAwareAspectJAutoProxyCreator的创建过程会涉及到一系列的步骤,例如首先尝试获取一个单例对象,如果获取不到则会创建...

    二、Spring源码分析——BeanFactory

    《Spring源码分析——BeanFactory》 在Java的IoC(Inversion of Control)和DI(Dependency Injection)领域,Spring框架扮演着至关重要的角色。BeanFactory是Spring的核心组件之一,它是容器的基石,负责管理应用...

    spring 个人小结 源码分析机制原理

    Spring提供多种实例化Bean的方式,这里以`XmlBeanFactory`为例,通过`FileSystemResource`加载XML配置文件,然后通过`getBean`方法获取Bean实例。在`getBean`内部,会根据Bean定义创建并初始化Bean对象,包括执行...

    Spring在应用中获得Bean的方法

    如果你知道Bean的类型,可以使用`getBean(Class&lt;T&gt; requiredType)`方法,Spring会返回与给定类型匹配的第一个Bean。 ```java ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); ...

    Spring IOC容器实现分析

    ### Spring IOC容器实现分析 #### 一、Spring IOC容器概览 Spring框架作为一款轻量级的开源框架,其核心之一便是IOC(Inversion of Control)容器。该容器的主要功能在于管理和控制对象间的依赖关系,使得开发人员...

    Spring简单模拟Spring容器

    6. 添加获取Bean实例的方法,模拟Spring容器的getBean功能。 在标签中提到了“源码”和“工具”,这意味着博客可能会深入到Spring框架的源码层面,分析其内部实现机制,同时也可能介绍了一些辅助开发的工具,比如...

    spring 获得applicationcontext公用方法

    本文将深入探讨如何在Spring中获取`ApplicationContext`的公用方法,并结合提供的两个文件名`ShipOrderRecipientImpl.java`和`MyApplicationContextUtil.java`来分析可能的实现方式。 1. `ApplicationContext`概述...

    Spring简单底层实现

    - 在所有依赖都正确注入之后,Spring可能会调用Bean的初始化方法(如果定义了的话),以便进行额外的初始化工作。 - 初始化方法可以是`init-method`属性指定的方法或者是实现了`InitializingBean`接口中的`...

    Spring源码分析

    最后,通过getBean方法从容器中获取需要的Bean实例。 以上所述均基于Spring源码层面的分析。在实际应用中,开发者通常会使用更为高级的配置方式,如基于注解的配置以及Java配置类(使用@Configuration注解的类)。...

    springtest.rar

    本文将深入探讨“springtest.rar”案例,通过分析构造方法注入和setter方法注入两种方式,来理解并掌握Spring的依赖注入机制。 首先,我们来看构造方法注入。当一个类的实例化需要依赖其他对象时,可以通过构造函数...

    spring源码剖析

    当我们调用`getBean`方法时,Spring会在这个Map中查找对应的bean。在`DefaultListableBeanFactory`的源码中,可以看到如下的逻辑: ```java public Object getBean(String name) throws BeansException { return ...

    Spring IOC 控制反转

    传统的程序设计中,通常是调用者主动去创建依赖对象或者调用依赖对象的方法,而在Spring框架中的IOC容器则负责将被依赖对象传入到调用者之中。这种模式使得组件之间的依赖关系由容器在运行期决定,即由容器动态地将...

    Spring2.5.6源代码分析(一):IOC容器

    本文将通过分析Spring源代码来揭示其IoC容器的工作原理。 首先,我们要理解IoC的概念。IoC是一种设计模式,它将对象的创建和管理从应用逻辑中解耦出来,由一个中心组件(如Spring的ApplicationContext)负责。在...

    spring JDBC

    - 通过`SpringUtil.getBean()`获取`DeptDao`实例,并调用其方法来展示结果。 通过上述代码示例,我们可以看到Spring JDBC如何简化了常见的数据库操作,使得开发者可以将更多的精力放在业务逻辑上,而不是底层的...

    简单Spring容器实现

    - **获取Bean**:通过`ApplicationContext`的`getBean`方法获取Bean实例,进行后续操作。 4. **源码分析** Spring容器的实现涉及到`DefaultListableBeanFactory`、`BeanDefinition`、`BeanPostProcessor`等多个类...

    模拟Spring的IOC

    - **依赖解析(Dependency Resolution)**:分析Bean之间的依赖关系,并在初始化Bean时注入依赖。 - **Bean实例化(Bean Instantiation)**:根据Bean定义创建Bean实例,可以使用反射API完成。 - **生命周期管理...

    spring源代码中文详解版

    BeanFactory接口提供了几个关键方法,例如`getBean(String name)`用于根据bean的名称获取bean实例;`getBean(String name, Class requiredType)`则在获取bean时,确保返回的实例与指定类型匹配。`containsBean...

Global site tag (gtag.js) - Google Analytics