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

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

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="car" class="com.itdjx.spring.factorybeans.CarFactoryBean">
<property name="name" value="BMW"/>
</bean> </beans>
 package com.itdjx.spring.factorybeans;

 /**
* @author Wáng Chéng Dá
* @create 2017-03-03 8:08
*/
public class Car { private String name; private int price; public int getPrice() {
return price;
} public void setPrice(int price) {
this.price = price;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Car(String name, int price) {
this.name = name;
this.price = price;
} @Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
}
 package com.itdjx.spring.factorybeans;

 import org.springframework.beans.factory.FactoryBean;

 /**
* @author Wáng Chéng Dá
* @create 2017-03-03 8:10
*/
public class CarFactoryBean implements FactoryBean { private String name; public void setName(String name) {
this.name = name;
} @Override //factoryBean 返回的实例
public Object getObject() throws Exception {
System.out.println("I am CarFactoryBean's getObject method...");
return new Car(name, 500000);
} @Override //factoryBean 返回的类型
public Class<?> getObjectType() {
System.out.println("I am CarFactoryBean's getObjectType method...");
return Car.class;
} @Override //返回的实例是否为单例
public boolean isSingleton() {
System.out.println("I am CarFactoryBean's isSingleton method...");
return true;
}
}
 package com.itdjx.spring.factorybeans;

 import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* @author Wáng Chéng Dá
* @create 2017-03-03 8:14
*/
public class Main { public static void main(String[] args) { ApplicationContext cxt = new ClassPathXmlApplicationContext("factory-beans.xml");
Car car = (Car) cxt.getBean("car");
System.out.println(car); }
}

控制台输出:

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 , 实例创建完成。

Spring学习--实现 FactoryBean 接口在 Spring IOC 容器中配置 Bean的更多相关文章

  1. spring在IoC容器中装配Bean详解

    1.Spring配置概述 1.1.概述 Spring容器从xml配置.java注解.spring注解中读取bean配置信息,形成bean定义注册表: 根据bean定义注册表实例化bean: 将bean ...

  2. 【spring源码学习】spring的IOC容器之自定义xml配置标签扩展namspaceHandler向IOC容器中注册bean

    [spring以及第三方jar的案例]在spring中的aop相关配置的标签,线程池相关配置的标签,都是基于该种方式实现的.包括dubbo的配置标签都是基于该方式实现的.[一]原理 ===>sp ...

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

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

  4. Spring扩展:替换IOC容器中的Bean组件 -- @Replace注解

    1.背景:     工作中是否有这样的场景?一个软件系统会同时有多个不同版本部署,比如我现在做的IM系统,同时又作为公司的技术输出给其他银行,不同的银行有自己的业务实现(比如登陆验证.用户信息查询等) ...

  5. Spring IOC容器中注入bean

    一.基于schema格式的注入 1.基本的注入方式 (属性注入方式) 根据setXxx()方法进行依赖注入,Spring只会检查是否有setter方法,是否有对应的属性不做要求 <bean id ...

  6. String框架搭建的基本步骤,及从 IOC & DI 容器中获取 Bean(spring框架bean的配置)--有实现数据库连接池的链接

    Spring框架的插件springsource-tool-suite-3.4.0.RELEASE-e4.3.1-updatesite(是一个压缩包)导入步骤: eclipse->help-> ...

  7. Spring重点—— IOC 容器中 Bean 的生命周期

    一.理解 Bean 的生命周期,对学习 Spring 的整个运行流程有极大的帮助. 二.在 IOC 容器中,Bean 的生命周期由 Spring IOC 容器进行管理. 三.在没有添加后置处理器的情况 ...

  8. 【String注解驱动开发】如何按照条件向Spring容器中注册bean?这次我懂了!!

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

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

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

随机推荐

  1. python2.7练习小例子(二十五)

        25):题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁.问第4个人岁数,他说比第3个人大2岁.问第三个人,又说比第2人大两岁.问第2个人,说比第一个人大两岁.最后问第一个人,他 ...

  2. Python的re模块的常用方法

    一.re的match与search方法 1.re.match方法 re.match 尝试从字符串的起始位置匹配一个模式,匹配成功re.match方法返回一个匹配的对象,如果不是起始位置匹配成功的话,m ...

  3. Word中使用宏调整表格

    Dim i As Integer   For i = 1 To Selection.Tables.Count Selection.Tables(i).Columns(9).Delete Selecti ...

  4. python爬取数据需要注意的问题

    1 爬取https的网站或是接口的时候,如果是不受信用的SSL证书,会报错,需要添加如下代码,如下代码可以保证当前代码块内所有的请求都自动屏蔽ssl证书问题: import ssl # 这个是爬取ht ...

  5. 时屏蔽ios和android下点击元素时出现的阴影

    -webkit-tap-highlight-color -webkit-tap-highlight-color:rgba(255,255,255,0)

  6. Java Set集合(HashSet、TreeSet)

    什么是HashSet?操作过程是怎么样的? 1.HashSet底层实际上是一个HashMap,HashMap底层采用了哈希表数据结构 2.哈希表又叫做散列表,哈希表底层是一个数组,这个数组中每一个元素 ...

  7. LeetCode 33——搜索旋转排序数组

    1. 题目 2. 解答 2.1. 方法一 直接进行二分查找,在判断查找方向的时候详细分类. 当 nums[mid] < target 时, 若 nums[left] <= nums[mid ...

  8. NO5——素数筛选

    #include <stdio.h> int main() { ]={}; ;i<=;i++) a[i]=; ;i<=;i++) if(a[i]) ;j+=i) a[j]=; ...

  9. 正则匹配java多行注释

    类似: /** * This method was generated by MyBatis Generator. * This method returns the value of the dat ...

  10. lintcode-84-落单的数 III

    84-落单的数 III 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字. 样例 给出 [1,2,2,3,4,4,5,3],返回 1和5 挑战 O(n)时间复杂度, ...