`
技术无涯苦作舟
  • 浏览: 12193 次
社区版块
存档分类
最新评论

Spring FactoryBean理解

 
阅读更多
这是开通这个ID后写的第一篇文章,所以絮叨下。最近在看Spring4.X的内容,期间遇到许多问题,还好相继都解决了。原本想把这些问题都记录到博客上,只是苦于生活中的责任,未能抽出时间完成,其实这也是给自己找理由,以后还是尽力多写写博文,也算是对自己的一种交代。不废话了,开干吧。

首先搞清楚BeanFactory和FactoryBean的区别:因为这俩长得有点像,所以说拉出来一起看看。

BeanFactory是一个类工厂,也叫SpringIOC容器,就是用来管理Bean的,也就是管理Java对象。它是Spring的基础设施,面向Spring本身,与之对应的有个Spring容器,较ApplicationContext,这个是面向Spring框架的开发者的,比BeanFactory要高级点,谁让BeanFactory是底层的呢。

而FactoryBean是一个工厂类接口,我们可以通过实现这个接口来定制实例化Bean的逻辑,意思就是说实现了这个接口,你就可以用它里面的方法来定制化如何实例化Bean.

简单点就是一个是容器,管理Bean的;另一个就是个接口,用来定制实例化Bean的。

下面说说FactoryBean。

从Spring3.0开始,它支持泛型了,就是接口声明变成了FactoryBean<T>。实现了它的类肯定必须实现它的方法,有3个:
T getObject(); 返回FactoryBean创建的Bean实例,注意它的返回类型是T,不是FactoryBean。

boolean isSingleton(); 确定Bean的作用域的,singleton还是prototype。
说说这两种作用域的区别:
一个是单实例的,实例化的Bean会放到SpringIOC容器的缓存池中,将Bean的引用返回给调用者,Spring继续对其进行生命周期管理;而prototype则是将Bean返回给调用者,然后Spring就不管了,由调用者对Bean进行后续生命周期管理。Spring将Bean的作用域默认为singleton.

Class<?>getObjectType()。返回FactoryBean创建Bean的类型。

重点说说使用的时候,主要是这个getBean()。

假设这样定义
<bean id="car" class="com.smart.fb.CarFactoryBean"
        p:carInfo="梅赛德斯奔驰GLE,300,8888888.88" />
当然com.smart.fb.CarFactoryBean肯定是实现了FactoryBean<T>接口的。

当调用getBean("car")的时候,返回的是CarFactoryBean的getObject()返回的工厂类创建的对象T,而不是CarFactoryBean。如果想要得到CarFactoryBean,则需要使用getBean("&car").

代码1:

public class CarFBTest {
    public static void main(String[] args) throws Exception {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("com/smart/fb/beans.xml");
        CarFactoryBean carfb = ctx.getBean("&car", CarFactoryBean.class);

        System.out.println(carfb.getObject().toString());
        System.out.println(carfb.getObjectType().toString());
        System.out.println(carfb.isSingleton());
    }
}

结果1:
Car{maxSpeed=300, brand='梅赛德斯奔驰GLE', price=8888888.88}
class com.smart.fb.Car
false

******************************************

代码2:
public class CarFBTest {
    public static void main(String[] args) throws Exception {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("com/smart/fb/beans.xml");
        Car car = ctx.getBean("car", Car.class);

        System.out.println(car.toString());
        System.out.println(car.getClass());
    }
}

结果2:
Car{maxSpeed=300, brand='梅赛德斯奔驰GLE', price=8888888.88}
class com.smart.fb.Car
分享到:
评论

相关推荐

    详解Spring中的FactoryBean

    在Spring框架中,`FactoryBean`是一个非常重要的接口,它为Spring容器提供了更高级别的抽象,使得我们可以自定义Bean的创建过程。...理解并熟练运用`FactoryBean`,对于提升Spring应用的可扩展性和灵活性具有重要意义。

    spring源码解析之FactoryBean相关测试代码demo

    在Spring框架中,`FactoryBean`是一个非常关键的接口,它允许我们自定义对象的创建方式,这在...通过阅读和理解`FactoryBean`相关的测试代码,我们可以更好地掌握Spring框架的内部机制,以及如何利用它来解决实际问题。

    Spring中的FactoryBean.rar

    在Spring框架中,FactoryBean是一个非常重要的概念,它允许我们自定义对象的创建方式,提供了...通过学习这部分内容,开发者能够更好地理解Spring IoC容器的工作原理,并能灵活运用FactoryBean解决复杂对象创建的问题。

    简单了解Spring中BeanFactory与FactoryBean的区别

    简单了解Spring中BeanFactory与FactoryBean的区别 Spring框架中有两个非常关键的接口:BeanFactory和FactoryBean。虽然它们的名字相似,但它们的作用...理解它们之间的区别对我们使用Spring框架开发应用程序非常重要。

    FactoryBean代码最简实现

    本篇我们将深入探讨`FactoryBean`的最简实现及其在Spring配置文件中的使用,帮助你理解其实例化过程。 `FactoryBean`是Spring框架提供的一种扩展点,它允许我们自定义对象的创建逻辑,而不仅仅是简单的通过`new`...

    SpringFactoryBean:spring FactoryBean的样本,在运行时在两个bean之间进行更改

    通过查看源码,我们可以更深入地理解`FactoryBean`的工作原理及其在实际项目中的应用。 总的来说,`FactoryBean`提供了一种强大的机制,让开发者能够在Spring容器中实现更灵活的对象创建和控制。通过结合条件判断和...

    SSH笔记-通过实现FactoryBean接口来创建 Bean

    在Spring框架中,`FactoryBean`接口是一个非常重要的组件,它允许我们自定义Bean的创建逻辑,这在...在SSH笔记中,通过`FactoryBean`的实践,可以更好地理解和掌握Spring4的高级特性,提升项目开发的灵活性和可控性。

    Spring中BeanFactory与FactoryBean接口的区别详解

    在Spring框架中,BeanFactory和FactoryBean是两个重要的接口,它们各自扮演着不同的角色,但都与Spring容器的管理和创建对象密切相关。...在面试或实际开发中理解这两者的区别对于掌握Spring的核心机制至关重要。

    FactoryBean.zip

    通过学习这些示例,开发者可以深入理解`FactoryBean`的工作原理,并能熟练运用到自己的项目中。 `FactoryBean`的应用不仅限于数据源,还可以用于创建任何需要复杂初始化的对象,如JMS连接工厂、EhCache缓存管理器等...

    初探spring aop内部实现 java

    本篇文章将深入探讨Spring AOP的内部实现,以及如何通过源代码理解其DataSource实现和FactoryBean模式。 首先,让我们了解AOP的基本概念。AOP的核心思想是“切面”,它封装了特定的关注点,如日志记录、事务管理、...

    spring-demo03-spring创建对象的5种方式.zip

    Spring的`FactoryBean`接口允许自定义Bean的创建逻辑。`FactoryBean`的`getObject()`方法返回实际的对象。这种方式适用于更复杂的实例化场景,如创建JDBC数据源或线程池。例如: ```java public class ...

    factory-bean-demo.7z

    通过理解`FactoryBean`的工作原理和应用场景,开发者能够更好地定制Spring容器的行为,解决复杂对象创建和管理的问题。`factory-bean-demo`项目则是一个很好的学习资源,可以深入理解并实践`FactoryBean`的用法。

    mybatis-spring-1.0.1-bundle.zip

    它扩展了 Spring 的 FactoryBean 接口,可以直接在 Spring 配置文件中声明,通过配置数据源、MyBatis 的配置文件等参数,轻松创建 SqlSessionFactory。 2. SqlSessionTemplate:这是一个线程安全的 SqlSession 实现...

    spring

    标题:Spring框架 描述:“just a try!”表明这是一次尝试性的学习或探索Spring框架的过程。 **Spring框架关键知识点解析** ...通过深入理解其核心概念和特性,开发者可以构建出更加健壮、可扩展的应用系统。

    使用ImportBeanDefinitionRegistrar、JDK代理、FactoryBean模拟mybatis原理.zip

    在Spring框架中,`ImportBeanDefinitionRegistrar`、JDK代理和`FactoryBean`是三个关键的概念,它们在实现复杂的应用逻辑和扩展Spring的功能时起到重要作用。让我们深入理解这些概念,并结合MyBatis的原理,来探讨...

    Spring-Reference_zh_CN(Spring中文参考手册)

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.6.1. @Transactional 有关的设置 ...

    Spring实例化Bean顺序

    这里,我们主要探讨的是Spring如何通过其IoC(Inversion of Control)容器来实例化Bean,并理解其背后的逻辑。 首先,我们要知道Spring IoC容器是通过XML配置文件、注解或Java配置类来管理Bean的生命周期。Bean的...

    mybatis,mybatis-spring

    - MapperFactoryBean:实现了Spring的FactoryBean接口,为每个Mapper接口创建一个代理对象,调用Mapper接口的方法时,会自动执行对应的SQL。 4. **MyBatis-Spring的使用** - 配置:在Spring配置文件中添加...

Global site tag (gtag.js) - Google Analytics