以下内容来自文章:
https://blog.csdn.net/wangbiao007/article/details/53183764
FactoryBean是一个接口,当在IOC容器中的Bean实现了FactoryBean后,通过getBean(String BeanName)获取到的Bean对象并不是FactoryBean的实现类对象,而是这个实现类中的getObject()方法返回的对象。要想获取FactoryBean的实现类,就要getBean(&BeanName),在BeanName之前加上&。
以下内容来自文章:
https://zhuanlan.zhihu.com/p/196688174
BeanFactory
这个其实是所有Spring Bean的容器根接口,给Spring 的容器定义一套规范,给IOC容器提供了一套完整的规范,比如我们常用到的getBean方法等
The root interface for accessing a Spring bean container. This is the basic client view of a bean container;
定义方法:
- getBean(String name): Spring容器中获取对应Bean对象的方法,如存在,则返回该对象
- containsBean(String name):Spring容器中是否存在该对象
- isSingleton(String name):通过beanName是否为单例对象
- isPrototype(String name):判断bean对象是否为多例对象
- isTypeMatch(String name, ResolvableType typeToMatch):判断name值获取出来的bean与typeToMath是否匹配
- getType(String name):获取Bean的Class类型
- getAliases(String name):获取name所对应的所有的别名
主要的实现类(包括抽象类):
- AbstractBeanFactory:抽象Bean工厂,绝大部分的实现类,都是继承于他
- DefaultListableBeanFactory:Spring默认的工厂类
- XmlBeanFactory:前期使用XML配置用的比较多的时候用的Bean工厂
- AbstractXmlApplicationContext:抽象应用容器上下文对象
- ClassPathXmlApplicationContext:XML解析上下文对象,用户创建Bean对象我们早期写Spring的时候用的就是他
使用方式:
- 使用ClassPathXmlApplicationContext读取对应的xml文件实例对应上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"});
BeanFactory factory = (BeanFactory) context;
FactoryBean
该类是SpringIOC容器是创建Bean的一种形式,这种方式创建Bean会有加成方式,融合了简单的工厂设计模式于装饰器模式
* Interface to be implemented by objects used within a {@link BeanFactory} which * are themselves factories for individual objects. If a bean implements this * interface, it is used as a factory for an object to expose, not directly as a * bean instance that will be exposed itself.
有些人就要问了,我直接使用Spring默认方式创建Bean不香么,为啥还要用FactoryBean做啥,在某些情况下,对于实例Bean对象比较复杂的情况下,使用传统方式创建bean会比较复杂,例如(使用xml配置),这样就出现了FactoryBean接口,可以让用户通过实现该接口来自定义该Bean接口的实例化过程。即包装一层,将复杂的初始化过程包装,让调用者无需关系具体实现细节。
方法:
- T getObject():返回实例
- Class<?> getObjectType();:返回该装饰对象的Bean的类型
- default boolean isSingleton():Bean是否为单例
常用类:
- ProxyFactoryBean :Aop代理Bean
- GsonFactoryBean:Gson
使用:
- Spring XML方式
application.xml
<?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="demo" class="cn.lonecloud.spring.example.bo.Person">
<property name="age" value="10"/>
<property name="name" value="xiaoMing"/>
</bean>
<bean id="demoFromFactory" class="cn.lonecloud.spring.example.bean.PersonFactoryBean">
<property name="initStr" value="10,init from factory"/>
</bean>
</beans>
personFactoryBean.java
package cn.lonecloud.spring.example.bean;
import cn.lonecloud.spring.example.bo.Person;
import org.springframework.beans.factory.FactoryBean;
import java.util.Objects;
/**
* TODO
*
* @author lonecloud <lonecloud@aliyun.com>
* @date 2020/8/24 16:00
* @since v1.0
*/
public class PersonFactoryBean implements FactoryBean<Person> {
/**
* 初始化Str
*/
private String initStr;
@Override
public Person getObject() throws Exception {
//这里我需要获取对应参数
Objects.requireNonNull(initStr);
String[] split = initStr.split(",");
Person p=new Person();
p.setAge(Integer.parseInt(split[0]));
p.setName(split[1]);
//这里可能需要还要有其他复杂事情需要处理
return p;
}
@Override
public Class<?> getObjectType() {
return Person.class;
}
public String getInitStr() {
return initStr;
}
public void setInitStr(String initStr) {
this.initStr = initStr;
}
}
main方法
package cn.lonecloud.spring.example.factory;
import cn.lonecloud.spring.example.bo.Person;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* BeanFactory 例子
*
* @author lonecloud <lonecloud@aliyun.com>
* @date 2020/8/24 16:00
* @since v1.0
*/
public class SpringBeanFactoryMain {
public static void main(String[] args) {
//这个是BeanFactory
BeanFactory beanFactory = new ClassPathXmlApplicationContext("application.xml");
//获取对应的对象化
Object demo = beanFactory.getBean("demo");
System.out.println(demo instanceof Person);
System.out.println(demo);
//获取从工厂Bean中获取对象
Person demoFromFactory = beanFactory.getBean("demoFromFactory", Person.class);
System.out.println(demoFromFactory);
//获取对应的personFactory
Object bean = beanFactory.getBean("&demoFromFactory");
System.out.println(bean instanceof PersonFactoryBean);
PersonFactoryBean factoryBean=(PersonFactoryBean) bean;
System.out.println("初始化参数为:"+factoryBean.getInitStr());
}
}
输出
true
Person{name='xiaoMing', age=10}
Person{name='init from factory', age=10}
true
初始化参数为:10,init from factory
区别
- BeanFactory:负责生产和管理Bean的一个工厂接口,提供一个Spring Ioc容器规范,
- FactoryBean: 一种Bean创建的一种方式,对Bean的一种扩展。对于复杂的Bean对象初始化创建使用其可封装对象的创建细节。
相关推荐
简单了解Spring中BeanFactory与FactoryBean的...BeanFactory和FactoryBean都是Spring框架中的重要组件,它们提供了不同的功能和机制来管理和生成Bean。理解它们之间的区别对我们使用Spring框架开发应用程序非常重要。
Spring 中的 BeanFactory 和 FactoryBean BeanFactory 是 Spring 框架中的核心组件之一,负责管理 Bean 的生命周期,包括实例化、配置和注入对象之间的关系。它是 Spring IOC(控制反转)容器的核心组件,提供了...
Spring BeanFactory和FactoryBean的区别解析 Spring框架中,BeanFactory和FactoryBean是两个非常重要的概念,它们都是Spring IoC容器的核心组件。今天,我们将深入探讨这两个概念之间的区别和联系。 首先,让我们...
在Spring框架中,BeanFactory和FactoryBean是两个重要的接口,它们各自扮演着不同的角色,但都与Spring容器的管理和创建对象密切相关。 **BeanFactory接口**是Spring容器的基础,它是整个Spring IoC(Inversion of ...
在Spring框架中,BeanFactory和FactoryBean都是非常重要的概念,它们都是Spring IoC容器的组成部分。今天,我们将深入探讨这两个概念的讲解。 一、BeanFactory BeanFactory是Spring IOC容器的基本实现,是Spring...
BeanFactory和FactoryBean的区别在于,BeanFactory需要遵循完整的创建流程,而FactoryBean只需要调用getObject()方法来返回具体对象。 Spring源码流程图是了解Spring框架核心组件和Bean生命周期的关键。通过了解...
11,beanfactory和factorybean的区别? 12,用过的设计模式有哪些?介绍一下负责链模式。 算法题: 1,三个线程顺序打印十个数。 2,合并两个有序数组 反问:索引的隔离级别是什么? 面试过程中面试官会做详细记录...
### 知识点三:BeanFactory 和 FactoryBean 的区别 #### 1.3.1 BeanFactory 和 FactoryBean 的区别 ##### BeanFactory - 以 Factory 结尾,表示它是一个工厂类,用于管理 Bean。 - 提供基本的 Bean 创建与依赖...
在学习了书籍Spring5.0后,将自己的理解总结成了ppt,主要包含了IoC 和 DI,AOP,BeanFactory和FactoryBean,事务管理四个方面
5. **Spring框架**:Spring相关的面试题目可能会涵盖BeanFactory和FactoryBean的区别、Spring的IoC和AOP原理、Bean的生命周期管理、事务管理、SpringMVC的工作流程,以及Spring中采用的设计模式等。 6. **网络编程...
Spring框架中的BeanFactory和FactoryBean也使用了工厂模式,它们负责根据配置信息创建并管理Bean对象。 2. **代理模式**:代理模式为其他对象提供一种代理以控制对这个对象的访问。在Struts中,ActionProxy可以视为...
它提供了创建和管理Bean的基础架构,同时也包含了其他核心类和接口,比如BeanFactory和FactoryBean等。 - **Core组件的特点**:Core组件更像是一个工具箱,包含了大量实用类和接口,用于支持Bean的创建和配置过程。...
工厂模式 - BeanFactory 和 FactoryBean - **BeanFactory**:作为 Spring 的核心接口之一,BeanFactory 是简单工厂模式的一个具体应用。它通过提供`getBean(String name)`方法,允许开发者通过唯一标识符获取相应...
1. **依赖注入**:Spring框架的核心机制之一,如何通过BeanFactory和FactoryBean实现依赖注入。 2. **Spring IOC容器**:IOC容器的初始化过程,如Bean的创建、装配和销毁。 3. **ApplicationContext**:与...
BeanFactory和FactoryBean区别 Spring事务配置 SpringBoot面试题 Java相关 三大特性:封装、继承、多态 抽象类和接口区别 Object类下的方法 Collection类 反射 ...
- **BeanFactory和FactoryBean的区别**: - `BeanFactory`:Spring的核心容器接口。 - `FactoryBean`:一种特殊的bean,可以创建并返回其他bean。 ### 八、Bean的生命周期 - **初始化阶段**:Spring容器创建bean...
1. **BeanFactory和FactoryBean**:`BeanFactory`是Spring的核心接口,用于创建和管理bean实例;`FactoryBean`则是用于创建其他bean的工厂bean。 2. **Spring IOC的理解**:控制反转(Inversion of Control, IoC)是...
六、BeanFactory和FactoryBean的区别 BeanFactory是IOC底层容器,而FactoryBean是创建Bean的一种方式,帮助实现复杂的初始化逻辑。 七、BeanFactory和ObjectFactory的区别 ObjectFactory和BeanFactory均提供依赖...
FactoryBean和BeanFactory都是Spring框架中的核心概念,但是它们的作用不同。BeanFactory是一个工厂接口,提供了基本的IoC容器功能,而FactoryBean是一个工厂类,负责创建和管理对象实例。BeanFactory是FactoryBean...
Spring 框架中 FactoryBean 是一个非常重要的概念,它提供了一种创建和管理 Bean 的机制。在 Spring 中,FactoryBean 是一个特殊的 Bean,它可以创建其他 Bean,並提供了对这些 Bean 的管理。今天,我们将深入探讨 ...