spring BeanFactory VS FactoryBean
一、FactoryBean示例
public class DateStringFactoryBean implements FactoryBean<Object> {
private boolean isDate;
public void setDate(boolean date) {
isDate = date;
}
@Override
public Object getObject() {
return isDate ? new Date() : "2018-03-04";
}
@Override
public Class<?> getObjectType() {
return isDate ? Date.class : String.class;
}
@Override
public boolean isSingleton() {
return false;
}
}
AppConfig
public class AppConfig {
@Bean(name = "dateFactoryBean")
public DateStringFactoryBean createString(){
DateStringFactoryBean bean = new DateStringFactoryBean();
bean.setDate(true);
return bean;
}
@Bean(name = "stringFactoryBean")
public DateStringFactoryBean createDate(){
DateStringFactoryBean bean = new DateStringFactoryBean();
bean.setDate(false);
return bean;
}
}
Main
public class Main {
public static void main(String[] args) {
AbstractApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
System.out.println(context.getBean("dateFactoryBean", Date.class));
System.out.println(context.getBean("stringFactoryBean", String.class));
System.out.println(context.getBean("&dateFactoryBean")); //使用&+beanName获得DateStringFactoryBean实例
System.out.println(context.getBean("&stringFactoryBean"));
}
}
二、调试分析
1. 系统启动时,会注册FactoryBean

2. context.getBean("dateFactoryBean", Date.class) 时

三、相关文档
Bean factory implementations should support the standard bean lifecycle interfaces as far as possible. The full set of initialization methods and their standard order is:
- BeanNameAware's
setBeanName - BeanClassLoaderAware's
setBeanClassLoader - BeanFactoryAware's
setBeanFactory - EnvironmentAware's
setEnvironment - EmbeddedValueResolverAware's
setEmbeddedValueResolver - ResourceLoaderAware's
setResourceLoader(only applicable when running in an application context) - ApplicationEventPublisherAware's
setApplicationEventPublisher(only applicable when running in an application context) - MessageSourceAware's
setMessageSource(only applicable when running in an application context) - ApplicationContextAware's
setApplicationContext(only applicable when running in an application context) - ServletContextAware's
setServletContext(only applicable when running in a web application context) postProcessBeforeInitializationmethods of BeanPostProcessors- InitializingBean's
afterPropertiesSet - a custom init-method definition
postProcessAfterInitializationmethods of BeanPostProcessors
BeanFactory 是 IOC 容器的编程抽象,比如 ApplicationContext, XmlBeanFactory 等,这些都是 IOC 容器的具体表现
FactoryBean 是一个可以在 IOC而容器中被管理的一个 bean,是对各种处理过程和资源使用的抽象,FactoryBean 在需要
时产生另一个对象,而不返回 FactoryBean本身,我们可以把它看成是一个抽象工厂,对它的调用返回的是工厂生产的产
品。Spring对代理对象的处理,对事务性代理的处理都使用了FactoryBean
public interface FactoryBean<T>
BeanFactory which are themselves factories for individual objects.NB: A bean that implements this interface cannot be used as a normal bean. A FactoryBean is defined in a bean style,
but the object exposed for bean references (getObject()) is always the object that it creates.
FactoryBeans can support singletons and prototypes, and can either create objects lazily on demand or eagerly on startup.
The SmartFactoryBean interface allows for exposing more fine-grained behavioral metadata.
This interface is heavily used within the framework itself, for example for the AOP ProxyFactoryBean .
It can be used for custom components as well; however, this is only common for infrastructure code.
FactoryBean is a programmatic contract. Implementations are not supposed to rely on annotation-driven injection
or other reflective facilities. getObjectType() getObject() invocations may arrive early in the bootstrap process, even
ahead of any post-processor setup. If you need access other beans, implement BeanFactoryAware and obtain them programmatically.
Finally, FactoryBean objects participate in the containing BeanFactory's synchronization of bean creation. There is usually no
need for internal synchronization other than for purposes of lazy initialization within the FactoryBean itself (or the like).
同类文章
spring BeanFactory VS FactoryBean的更多相关文章
- Spring BeanFactory与FactoryBean的区别及其各自的详细介绍于用法
Spring BeanFactory与FactoryBean的区别及其各自的详细介绍于用法 1. BeanFactory BeanFactory,以Factory结尾,表示它是一个工厂类(接口),用于 ...
- Spring BeanFactory 与 FactoryBean 的区别
BeanFactory 和 FactoryBean 都是Spring Beans模块下的接口 BeanFactory是spring简单工厂模式的接口类,spring IOC特性核心类,提供从工厂类中获 ...
- BeanFactory 和FactoryBean的区别
转自:https://www.cnblogs.com/aspirant/p/9082858.html BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是 ...
- Difference between BeanFactory and FactoryBean in Spring Framework (Spring BeanFactory与Factory区别)
参见原文:http://www.geekabyte.io/2014/11/difference-between-beanfactory-and.html geekAbyte Codes and Ran ...
- Spring中BeanFactory与FactoryBean的区别
在Spring中有BeanFactory和FactoryBean这2个接口,从名字来看很相似,比较容易搞混. 一.BeanFactory BeanFactory是一个接口,它是Spring中工厂的顶层 ...
- Spring的BeanFactory和FactoryBean
官方定义 BeanFactory:Spring Bean容器的根接口 FactoryBean:各个对象的工厂接口,如果bean实现了这个接口,它将被用作对象的工厂,而不是直接作为bean实例. 源码解 ...
- spring:Beanfactory和ApplicationContext、BeanFactory 和 FactoryBean
1.Beanfactory和ApplicationContext有什么区别 ApplicationContext (1)在配置文件加载后创建bean 利用debug方式,在Student类的无参构造方 ...
- Spring中的BeanFactory与FactoryBean看这一篇就够了
前言 理解FactoryBean是非常非常有必要的,因为在Spring中FactoryBean最为典型的一个应用就是用来创建AOP的代理对象,不仅如此,而且对理解Mybatis核心源码也非常有帮助!如 ...
- Spring中BeanFactory与FactoryBean到底有什么区别?
一.BeanFactory BeanFactory是一个接口,它是Spring中工厂的顶层规范,是SpringIoc容器的核心接口,它定义了getBean().containsBean()等管理Bea ...
随机推荐
- pandas Series的sort_values()方法
pandas Series的 sort_values() 方法能对Series进行排序,返回一个新的Series: s = pd.Series([np.nan, 1, 3, 10, 5]) 升序排列: ...
- Linux系统查毒软件ClamAV (online)
ClamAV是一个可用于Linux平台上的开源杀毒引擎,可检测木马.病毒.恶意软件和其他恶意的威胁. 官网:http://www.clamav.net/ 一.CentOS环境安装 # yum inst ...
- jQuery创建元素和添加子元素
var li = $("<li class=\"TopNav arrow\" secondMenu=\"menu_" + i + "\ ...
- 【Java基础】Java注解简单入门
注解简单来说就是配置,是特别的配置,之前常用的配置文件,可以用注解替换.然后通过反射去获取注解的信息. 如何定义一个注解 你在IDE中新建一个注解定义,是这样的结构的: package com.nic ...
- Git入门到高级系列1-git安装与基础命令
视频课程地址 腾讯课堂 为什么要进行项目文件的版本管理 代码备份和恢复 团队开发和协作流程 项目分支管理和备份 git 是什么? git是一个分布式的版本控制软件.版本控制是一种记录一个或若干文件内容 ...
- dubbo的服务发现和注册如何实现
Dubbo通常我们是如何使用的? #================================================================================== ...
- IDEA自动生成序列化ID
1.安装 serialVersionUID 插件: 2.设置你的IDEA为检查序列化ID 3.重启IDEA(有的版本可以不重启) 4.在需要自动生成序列化ID的类中使用快捷键:Alt+Insert 转 ...
- php -- new self() 和 new static
看一段摘自网上的代码 class A { public static function get_self() { return new self(); } public static function ...
- 一个tomcat服务器上部署多个Web项目,不同域名访问
[参考]一个tomcat服务器上部署多个项目,不同域名访问 我们一个服务器只按装了一个tomcat服务器,现在有多个项目或者多个域名访问,下面来进行配置 在这里我们只需要修改conf下的server. ...
- mysql的某个数据库拒绝访问的问题
场景: mysql自带的mysql和test库都可以正常连接. 新建一个数据库demo,配置java访问时报错:Access denied for user 'root'@'localhost' (u ...