通常你不大会通过Spring中的ApplicationContext直接取bean,你往往通过IOC的方式在你的action或者service等中得到现成的bean,但是在一些特殊情况下你会这样使用。
我今天就遇到这种情况
我需要在测试的时候刷新缓存,那么我直接取出SqlMapClient,虽然也可以搞个注入什么的,但那样太麻烦,
<beanid="sqlMapClient"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<propertyname="configLocation">
<value>classpath:/moxtv/central/dao/impl/write/maps/sql-map-config.xml</value>
</property>
</bean>
后来我写了如下代码
.......
SqlMapClientclient=(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(beaninstanceofFactoryBean&&!BeanFactoryUtils.isFactoryDereference(name))...{
try...{
return((FactoryBean)bean).getObject();
}
catch(Exceptionex)...{
thrownewBeanCreationException(beanName,"FactoryBeanthrewexceptiononobjectcreation",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 已经成为 Java 领域中最受欢迎的企业级开发框架之一。它不断地演进和发展,以适应不断变化的技术需求和趋势。 #### 2.3 设计理念 Spring 的设计理念强调了以下几个方面: - **非侵入性**:...
在 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`是其中的一个典型接口,当...