通常你不大会通过Spring中的ApplicationContext直接取bean,你往往通过IOC的方式在你的action或者service等中得到现成的bean,但是在一些特殊情况下你会这样使用。
我今天就遇到这种情况
我需要在测试的时候刷新缓存,那么我直接取出SqlMapClient,虽然也可以搞个注入什么的,但那样太麻烦,
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>classpath:/moxtv/central/dao/impl/write/maps/sql-map-config.xml</value>
</property>
</bean>
后来我写了如下代码
.......
SqlMapClient client = (SqlMapClient) SpringBeanProxy
.getBean("sqlMapClient");
.......
一切ok
但是后来我发现org.springframework.orm.ibatis.SqlMapClientFactoryBean
并没有实现SqlMapClient接口,上面那种转型的写法怎么会正确?
通过观察发现org.springframework.orm.ibatis.SqlMapClientFactoryBean 中含有一个getBean方法返回SqlMapClient, 然后这个方法被org.springframework.beans.factory.support.AbstractBeanFactory的 getObjectForSharedInstance方法和StaticListableBeanFactory的getBean方法调用,这两个方法进行调用时都有一个共同的特征就是
if (bean instanceof FactoryBean && !BeanFactoryUtils.isFactoryDereference(name)) ...{
try ...{
return ((FactoryBean) bean).getObject();
}
catch (Exception ex) ...{
throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex);
}
}
再一看SqlMapClientFactoryBean 果然实现了FactoryBean 接口
总结如下:
如果一个bean属于 FactoryBean,那么从spring的bean工厂取出来的时候,并不是它本身,而是它的getObject返回的对象.所以表面上的那种转型不匹配就不足为怪了
分享到:
相关推荐
在Java的Spring框架中,`getBean`方法和`JdbcTemplate`是两个核心且重要的概念。它们分别代表了Spring对依赖注入(Dependency Injection,DI)的实现和数据库操作的简化处理。 首先,让我们来深入理解Spring的`...
在Spring框架中,`getBean`方法是核心的组件实例化和管理的入口,它用于从IoC容器中获取指定的Bean。这个过程涉及到多个步骤,确保Bean的正确创建、初始化以及依赖注入。以下是`getBean`方法的主要流程: 1. **开始...
本文将详细介绍如何在Spring中通过`ApplicationContext`的`getBean`方法获取注入对象,并通过实例来展示其使用。 首先,我们来看`ApplicationContextAware`接口,它是Spring提供的一个回调接口。当Spring容器创建了...
加载spring配置文件,提供getBean接口.
`getBean`是Spring框架提供的一个方法,位于`ApplicationContext`接口中,用于从Spring容器中获取一个已注册的bean实例。通常,bean在配置文件中定义,然后通过`getBean`来获取并使用。例如,我们可以使用以下方式...
然而,在某些情况下,我们可能需要在非Spring注解的类中访问Spring容器中的Bean,或者在这些类中使用YAML配置文件中的配置信息。本篇将详细介绍如何在这样的场景下实现这一目标。 首先,让我们来理解如何在非Spring...
在Spring框架中,ApplicationContext是核心组件,它负责加载配置,管理Bean的生命周期,并提供依赖注入。Quartz则是一个强大的任务调度库,可以用于计划和执行周期性任务。本篇文章将探讨如何结合Spring的...
spring Bean的生命周期
《SpringUtils.java:在非Spring环境中的Bean管理》 在Java开发中,Spring框架以其强大的依赖注入和面向切面编程能力,成为了企业级应用的首选。然而,在某些场景下,如测试、独立运行的工具类或者非Spring管理的...
Spring中ApplicationContext加载机制 ApplicationContext 是 Spring 框架中的核心组件之一,负责加载和管理应用程序中的 Bean 对象。在 Web 应用程序中,ApplicationContext 的加载机制是非常重要的, Spring 提供...
### Spring中Quartz的配置详解 #### 一、前言 Spring框架因其强大的功能和灵活性在企业级应用开发中占据了一席之地。其中,对于定时任务的支持,Spring结合了Quartz这一优秀的开源任务调度框架,提供了更为灵活和...
8. **获取Bean**:在程序中,我们可以从`ApplicationContext`获取已定义的Bean,如`HelloWorld helloWorld = context.getBean("helloWorld", HelloWorld.class);`,然后调用其方法进行交互。 9. **运行和测试**:...
在 Spring 框架中,IOC 容器扮演着核心角色,本文将深入分析 Spring 源码,了解 IOC 容器的实现机制和基本原理。 一、IOC 容器 IOC容器是 Spring 框架的核心组件之一,它提供了一个统一的方式来管理应用程序中的...
6. 添加获取Bean实例的方法,模拟Spring容器的getBean功能。 在标签中提到了“源码”和“工具”,这意味着博客可能会深入到Spring框架的源码层面,分析其内部实现机制,同时也可能介绍了一些辅助开发的工具,比如...
5. 实现业务逻辑:在Action类中,通过@Autowired注解或通过Spring的getBean方法获取由Spring管理的Service类,然后在Service中调用Hibernate的相关操作来处理业务逻辑。 6. 控制事务:Spring的声明式事务管理可以在...
在Spring框架中,静态方法内部注入Bean导致空指针异常是一个常见的问题,特别是在处理较旧的项目时。这里我们分析两种解决这个问题的方法。 首先,让我们深入理解问题的原因。在Spring中,`@Autowired`注解用于自动...
这意味着,对于每个`getBean()`方法的调用,Spring都会创建一个新的Bean实例。这种作用域适用于那些需要频繁创建或销毁的对象。 **配置示例**: ```xml <bean id="role" class="spring.chapter2.maryGame.Role" ...
4. **读取并使用配置**:在主程序中,使用`ClassPathXmlApplicationContext`类加载配置文件,并通过`getBean`方法获取bean实例,调用其方法。 ### Spring框架的应用上下文(ApplicationContext) `...
在Spring框架中,`Spring-Aware`接口是一个重要的概念,它允许我们与Spring的应用上下文(ApplicationContext)进行交互,从而获取或操作由Spring管理的Bean。`ApplicationContextAware`是其中的一个典型接口,当...
在Java开发环境中,Spring框架因其强大的功能和灵活性而被广泛应用于企业级应用的开发之中。其中一个重要的特性就是其依赖注入(Dependency Injection, DI)机制,它可以帮助开发者更好地管理对象之间的依赖关系,...