Spring 中有两种类型的 bean , 一种是普通的 bean , 另一种是工厂 bean , 即 FactroyBean。

工厂 bean 跟普通 bean 不同 , 其返回的对象不是指定类的一个实例 , 其返回的是该工厂 bean 的 getObject 方法所返回的对象。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 5
 6     <bean id="car" class="com.itdjx.spring.factorybeans.CarFactoryBean">
 7         <property name="name" value="BMW"/>
 8     </bean>
 9
10 </beans>

 1 package com.itdjx.spring.factorybeans;
 2
 3 /**
 4  * @author Wáng Chéng Dá
 5  * @create 2017-03-03 8:08
 6  */
 7 public class Car {
 8
 9     private String name;
10
11     private int price;
12
13     public int getPrice() {
14         return price;
15     }
16
17     public void setPrice(int price) {
18         this.price = price;
19     }
20
21     public String getName() {
22         return name;
23     }
24
25     public void setName(String name) {
26         this.name = name;
27     }
28
29     public Car(String name, int price) {
30         this.name = name;
31         this.price = price;
32     }
33
34     @Override
35     public String toString() {
36         return "Car{" +
37                 "name='" + name + '\'' +
38                 ", price=" + price +
39                 '}';
40     }
41 }

 1 package com.itdjx.spring.factorybeans;
 2
 3 import org.springframework.beans.factory.FactoryBean;
 4
 5 /**
 6  * @author Wáng Chéng Dá
 7  * @create 2017-03-03 8:10
 8  */
 9 public class CarFactoryBean implements FactoryBean {
10
11     private String name;
12
13     public void setName(String name) {
14         this.name = name;
15     }
16
17     @Override //factoryBean 返回的实例
18     public Object getObject() throws Exception {
19         System.out.println("I am CarFactoryBean's getObject method...");
20         return new Car(name, 500000);
21     }
22
23     @Override //factoryBean 返回的类型
24     public Class<?> getObjectType() {
25         System.out.println("I am CarFactoryBean's getObjectType method...");
26         return Car.class;
27     }
28
29     @Override //返回的实例是否为单例
30     public boolean isSingleton() {
31         System.out.println("I am CarFactoryBean's isSingleton method...");
32         return true;
33     }
34 }

 1 package com.itdjx.spring.factorybeans;
 2
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5
 6 /**
 7  * @author Wáng Chéng Dá
 8  * @create 2017-03-03 8:14
 9  */
10 public class Main {
11
12     public static void main(String[] args) {
13
14         ApplicationContext cxt = new ClassPathXmlApplicationContext("factory-beans.xml");
15         Car car = (Car) cxt.getBean("car");
16         System.out.println(car);
17
18     }
19 }

控制台输出:

I am CarFactoryBean's isSingleton method...
I am CarFactoryBean's getObjectType method...
I am CarFactoryBean's isSingleton method...
I am CarFactoryBean's getObject method...
Car{name='BMW', price=500000}

创建 IOC 容器时调用 isSingleton 若是返回 true 调用 getObjectType , 若返回 false , IOC 直接创建完成。

创建 Car 实例时调用 isSingleton -->> getObject , 实例创建完成。

转载于:https://www.cnblogs.com/goodcheap/p/6494105.html

Spring学习--实现 FactoryBean 接口在 Spring IOC 容器中配置 Bean相关推荐

  1. 【小家Spring】Spring注解驱动开发---向Spring Ioc容器中注册Bean的7种方式

    每篇一句 比你有钱的人一定会比你努力,而比你努力的人终有一天会比你有钱 前言 Spring是一个非常强大的反转控制(IOC)框架,以帮助分离项目组件之间的依赖关系.因此可以说Spring容器对Bean ...

  2. Spring 学习笔记 3. 尚硅谷_佟刚_Spring_配置 Bean

    1,bean 的配置 <bean id="helloWorld" class="com.yfy.HelloWorld"><property n ...

  3. java 从一个容器获取对象,如何从 Spring IoC 容器中获取对象?

    前面几篇文章主要分析了 Spring IoC 容器如何初始化,以及解析和注册我们定义的 bean 信息. 其中,「Spring 中的 IoC 容器」对 Spring 中的容器做了一个概述,「Sprin ...

  4. Spring注解驱动开发第7讲——如何按照条件向Spring容器中注册bean?这次我懂了!!

    写在前面 当bean是单实例,并且没有设置懒加载时,Spring容器启动时,就会实例化bean,并将bean注册到IOC容器中,以后每次从IOC容器中获取bean时,直接返回IOC容器中的bean,而 ...

  5. 六、spring之通过FactoryBean为ioc容器中添加组件

    前面我们已经介绍了几种为容器中添加组件的方法,今天一起学习通过FactoryBean添加组件的方法. 首先我们准备一个类,也就是我们需要注册进spring的ioc容器中的类 类Color: // 不必 ...

  6. Spring学习总结(一)——Spring实现IoC的多种方式

    一.Spring框架概述 Spring是一个开源免费的框架,为了解决企业应用开发的复杂性而创建.Spring框架是一个轻量级的解决方案,可以一站式地构建企业级应用.Spring是模块化的,所以可以只使 ...

  7. Spring学习手札(三)理解IoC 拯救不开心

    Inverse of Control,翻译成"控制反转",是Spring的核心.IoC不是一种技术,而是一种设计思想.就是将原本在程序中手动创建对象的控制权(new Object( ...

  8. Spring学习第3篇:Spring容器的基本使用

    大家家好,我是一名网络怪咖,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知Spring重要性,现在普遍都使用SpringBoot来开发,面试的时候SpringBoot原理也 ...

  9. Spring注解驱动开发第11讲——面试官让我说说:如何使用FactoryBean向Spring容器中注册bean?

    写在前面 经过前面的学习,我们知道可以通过多种方式向Spring容器中注册bean.可以使用@Configuration注解结合@Bean注解向Spring容器中注册bean:可以按照条件向Sprin ...

最新文章

  1. 第二周 数据分析之展示 Matplotlib库入门
  2. 要不来重新认识Spring事务?三歪又学到了
  3. 守列划分问题(圆排列+排列dp+结论)
  4. ubuntu-14.04.2-desktop使用方法
  5. 带你掌握不同平台下,探索JDK源码所需的native方法
  6. 卓有成效的管理者——彼得·德鲁克
  7. c语言中文件指针概念,C语言文件的概念和文件指针
  8. 【那些年我们用过的Redis】还记得大明湖畔那些Redis数据吗?
  9. 【​观察】做好数据到介质的连接者 新数据时代浪潮存储的行与思
  10. [落选]2021微信大数据挑战赛_总结
  11. oracle试算平衡表查询,试算平衡表
  12. 如何将m4a格式音频转为mp3?
  13. excel计算两列差的公式和方法
  14. 腾讯的分布式国产数据库Tbase,每天支撑 10 亿笔交易
  15. C语言随机刷新,C语言 刷新缓冲区
  16. “清华女神”回国,赤子之心,如愿以偿
  17. C++ Primer Plus (第六版)编程练习记录(chapter8 函数探幽)
  18. java c 速度_Java和C#运行速度对比:Java比C#快约3倍
  19. 第十二届“挑战杯”QG学子载誉归来,荣获全国决赛“一等奖”
  20. Java调用linux终端命令

热门文章

  1. js exec方法详解
  2. 使用haskell来解线性方程
  3. Flutter PageView 实现的自动轮播图效果 Timer实现的自动轮播效果
  4. postgresql9.1_gaussdb200_解析表结构
  5. 浏览器中的JavaScript
  6. 设置 webbrowser 控件的表现形式,可以像你本机的IE浏览器一样
  7. 前端工程师需要懂的前端面试题(c s s方面)总结(二)
  8. jQuery Moblie 页面模版(基础)
  9. Snabbdom(虚拟dom-5-patch函数)
  10. linux下进程的创建代码,Linux下进程创建分析