Spring中FactoryBean与BeanFactory的区别
版本:spring-framework-4.1
一概述
BeanFactory 与 FactoryBean的区别, 两个名字很像,面试中也经常遇到,所以容易搞混,现从源码以及示例两方面来分析。
二、源码
2.1 BeanFactory
BeanFactory定义了 IOC 容器的最基本形式,并提供了 IOC 容器应遵守的的最基本的接口,也就是 Spring IOC 所遵守的最底层和最基本的编程规范。
BeanFactory仅是个接口,并不是IOC容器的具体实现,具体的实现有:如 DefaultListableBeanFactory 、 XmlBeanFactory 、 ApplicationContext 等。
public interface BeanFactory {
//FactoryBean前缀
String FACTORY_BEAN_PREFIX = "&";
//根据名称获取Bean对象
Object getBean(String name) throws BeansException;
///根据名称、类型获取Bean对象
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
//根据类型获取Bean对象
<T> T getBean(Class<T> requiredType) throws BeansException;
//根据名称获取Bean对象,带参数
Object getBean(String name, Object... args) throws BeansException;
//根据类型获取Bean对象,带参数
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
//是否存在
boolean containsBean(String name);
//是否为单例
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
//是否为原型(多实例)
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
//名称、类型是否匹配
boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;
//获取类型
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
//根据实例的名字获取实例的别名
String[] getAliases(String name);
}
2.1 FactoryBean
FactoryBean工厂类接口,用户可以通过实现该接口定制实例化 Bean 的逻辑。
public interface FactoryBean<T> {
//FactoryBean 创建的 Bean 实例
T getObject() throws Exception;
//返回 FactoryBean 创建的 Bean 类型
Class<?> getObjectType();
//返回由 FactoryBean 创建的 Bean 实例的作用域是 singleton 还是 prototype
boolean isSingleton();
}
三、示例
3.1 普通bean
public class Dog {
private String msg;
public Dog(String msg){
this.msg=msg;
}
public void run(){
System.out.println(msg);
}
}
3.2 实现了FactoryBean的bean
public class DogFactoryBean implements FactoryBean<Dog>{
public Dog getObject() throws Exception {
return new Dog("DogFactoryBean.run");
}
public Class<?> getObjectType() {
return DogFactoryBean.class;
}
public boolean isSingleton() {
return false;
}
}
3.3 配置文件
<bean id="dog" class="com.bean.Dog" >
<constructor-arg value="Dog.run"/>
</bean>
<bean id="dogFactoryBean" class="com.bean.DogFactoryBean" />
3.4 测试
@Test
public void testBean() throws Exception {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Dog dog1 = (Dog) ctx.getBean("dog");
dog1.run();
Dog dog2 = (Dog) ctx.getBean("dogFactoryBean");
dog2.run();
//使用&前缀可以获取FactoryBean本身
FactoryBean dogFactoryBean = (FactoryBean) ctx.getBean("&dogFactoryBean");
Dog dog3= (Dog) dogFactoryBean.getObject();
dog3.run();
}
结果输出:
Dog.run
DogFactoryBean.run
DogFactoryBean.run
四、总结
通过以上源码和示例来看,基本上能印证以下结论,也就是二者的区别。
BeanFactory是个Factory,也就是 IOC 容器或对象工厂,所有的 Bean 都是由 BeanFactory( 也就是 IOC 容器 ) 来进行管理。
FactoryBean是一个能生产或者修饰生成对象的工厂Bean,可以在IOC容器中被管理,所以它并不是一个简单的Bean。当使用容器中factory bean的时候,该容器不会返回factory bean本身,而是返回其生成的对象。
Spring中FactoryBean与BeanFactory的区别的更多相关文章
- Spring 中 ApplicationContext 和 BeanFactory 的区别,以及 Spring bean 作用域
//从ApplicationContext 中取 bean ApplicationContext ac = new ClassPathXmlApplicationContext ( "com ...
- Spring 中 ApplicationContext 和 BeanFactory 的区别
//从ApplicationContext 中取 bean ApplicationContext ac = new ClassPathXmlApplicationContext ( "com ...
- Spring中ClassPathXmlApplication与FileSystemXmlApplicationContext的区别
Spring中ClassPathXmlApplication与FileSystemXmlApplicationContext的区别 一.概述 在项目中遇到加载不到Spring配置文件,简单分析后,写此 ...
- Spring中ApplicationContext和beanfactory区别---解析一
BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的BeanFactory.原始的BeanFactory无法支持spring的许多插件,如AOP ...
- Spring中ApplicationContext和beanfactory区别
BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的BeanFactory.原始的BeanFactory无法支持spring的许多插件,如AOP ...
- 7.FactoryBean 和BeanFactory去区别
FactoryBean源码: /* * Copyright 2002-2012 the original author or authors. * * Licensed under the Apach ...
- Spring中FactoryBean的作用和实现原理
BeanFactory与FactoryBean,相信很多刚翻看Spring源码的同学跟我一样很好奇这俩货怎么长得这么像,分别都是干啥用的.BeanFactory是Spring中Bean工厂的顶层接口, ...
- 一文带你解读Spring5源码解析 IOC之开启Bean的加载,以及FactoryBean和BeanFactory的区别。
前言 通过往期的文章我们已经了解了Spring对XML配置文件的解析,将分析的信息组装成BeanDefinition,并将其保存到相应的BeanDefinitionRegistry中,至此Spring ...
- Spring中的接口BeanFactory和FactoryBean的学习
BeanFactory: 相当于对象工厂,可以获取对象的实例以及相应的属性.BeanFactory定义了IOC容器的最基本形式,并提供了IOC容器应遵守的的最基本的接口,也就是Spring IOC所遵 ...
随机推荐
- CyclicBarrier实现流水处理服务类
package com.yzu.zhang.thread.concurrent; import java.util.Map.Entry; import java.util.Random; import ...
- 20145319 《网络对抗》逆向与Bof基础
20145319 逆向与Bof实验 1 实验内容 本次实验以可执行文件pwn1为例,将对pwn1进行反汇编的基础上进行功能上的解读,并进行缓冲区溢出攻击 可执行文件pwn1的正常流程是主函数调用foo ...
- sqlite的缺点和限制
随着查询变大变复杂,查询时间使得网络调用或者事务处理开销相形见绌, 这时一些大型的设计复杂的数据库开始发挥作用了. 虽然SQLite也能处理复杂的查询,但是它没有精密的优化器或者查询计划器. SQLi ...
- ubuntu 16.04+Anaconda+theano+keras安装【转】
本文转载自:https://blog.csdn.net/u013786021/article/details/78370138 安装软件部分浪费了好长时间才装好.之前一直各种问题,后来卸卸了radin ...
- 【异常记录(六)】vs文件乱码:文件加载,使用Unicode(UTF-8)编码加载文件xxx时,有些字节已用Unicode替换字符替换。保存该文件将不会保留原始文件内容。
VS2013偶遇这种情况,页面汉字编码出现乱码. .... 按照网上查到的: 工具>选项>文本编辑器> 勾选了 然并卵,还是乱码... 其实炒鸡简单 用记事本打开另存为,选择 ...
- HDU 4745 Two Rabbits(最长回文子序列)
http://acm.hdu.edu.cn/showproblem.php?pid=4745 题意: 有一个环,现在有两只兔子各从一个点开始起跳,一个沿顺时针,另一个沿逆时针,只能在一圈之内跳,并且每 ...
- Android:你好,androidX!再见,android.support
1.AndroidX简介 点击查看Android文档中对androidx的简介 按照官方文档说明 androidx 是对 android.support.xxx 包的整理后产物.由于之前的suppor ...
- Android之第三方平台实现QQ登录和QQ分享
目前大多数APP都包含了第三方平台的登录,特别是QQ和微信,这篇博客主要讲的是如何实现QQ第三方平台实现QQ登录和分享功能,功能包含: 登录授权登录获取用户信息(昵称,头像,地址等) QQ分享给好友 ...
- java打开windows系统的浏览器
获得百度的数据有两种方式,一种是用Url从流中获得,另一种是直接打开浏览器.文字识别(OCR)后再转码可以快速百度 public static void main(String[] args) thr ...
- HDU1565 方格取数 &&uva 11270 轮廓线DP
方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...