1、
BeanFactory
BeanFactory定义了
IOC
容器的最基本形式,并提供了
IOC
容器应遵守的的最基本的接口,也就是
Spring IOC
所遵守的最底层和最基本的编程规范。在
Spring
代码中,
BeanFactory
只是个接口,并不是
IOC
容器的具体实现,但是
Spring
容器给出了很多种实现,如
DefaultListableBeanFactory
、
XmlBeanFactory
、
ApplicationContext
等,都是附加了某种功能的实现。
package org.springframework.beans.factory;
import org.springframework.beans.BeansException;
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
Object getBean(String name, 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、
FactoryBean
一般情况下,Spring
通过反射机制利用
<bean>
的
class
属性指定实现类实例化
Bean
,在某些情况下,实例化
Bean
过程比较复杂,如果按照传统的方式,则需要在
<bean>
中提供大量的配置信息。配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案。
Spring
为此提供了一个
org.springframework.bean.factory.FactoryBean
的工厂类接口,用户可以通过实现该接口定制实例化
Bean
的逻辑。
FactoryBean接口对于
Spring
框架来说占用重要的地位,
Spring
自身就提供了
70
多个
FactoryBean
的实现。它们隐藏了实例化一些复杂
Bean
的细节,给上层应用带来了便利。从
Spring 3.0
开始,
FactoryBean
开始支持泛型,即接口声明改为
FactoryBean<T>
的形式:
package org.springframework.beans.factory;
public interface FactoryBean<T> {
T getObject() throws Exception;
Class<?> getObjectType();
boolean isSingleton();
}
在该接口中还定义了以下3
个方法:
T getObject():返回由
FactoryBean
创建的
Bean
实例,如果
isSingleton()
返回
true
,则该实例会放到
Spring
容器中单实例缓存池中;
boolean isSingleton():返回由
FactoryBean
创建的
Bean
实例的作用域是
singleton
还是
prototype
;
Class<T> getObjectType():返回
FactoryBean
创建的
Bean
类型。
当配置文件中<bean>
的
class
属性配置的实现类是
FactoryBean
时,通过
getBean()
方法返回的不是
FactoryBean
本身,而是
FactoryBean#getObject()
方法所返回的对象,相当于
FactoryBean#getObject()
代理了
getBean()
方法。
例:如果使用传统方式配置下面Car
的
<bean>
时,
Car
的每个属性分别对应一个
<property>
元素标签。
package com.baobaotao.factorybean;
public class Car {
private int maxSpeed ;
private String brand ;
private double price ;
public int getMaxSpeed () {
return this . maxSpeed ;
}
public void setMaxSpeed ( int maxSpeed ) {
this . maxSpeed = maxSpeed;
}
public String getBrand () {
return this . brand ;
}
public void setBrand ( String brand ) {
this . brand = brand;
}
public double getPrice () {
return this . price ;
}
public void setPrice ( double price ) {
this . price = price;
}
}
如果用FactoryBean
的方式实现就灵活点,下例通过逗号分割符的方式一次性的为
Car
的所有属性指定配置值:
package com.baobaotao.factorybean;
import org.springframework.beans.factory.FactoryBean;
public class CarFactoryBean implements FactoryBean<Car> {
private String carInfo ;
public Car getObject () throws Exception {
Car car = new Car () ;
String [] infos = carInfo .split ( "," ) ;
car.setBrand ( infos [ 0 ]) ;
car.setMaxSpeed ( Integer. valueOf ( infos [ 1 ])) ;
car.setPrice ( Double. valueOf ( infos [ 2 ])) ;
return car;
}
public Class<Car> getObjectType () {
return Car. class ;
}
public boolean isSingleton () {
return false ;
}
public String getCarInfo () {
return this . carInfo ;
}
// 接受逗号分割符设置属性信息
public void setCarInfo ( String carInfo ) {
this . carInfo = carInfo;
}
}
有了这个CarFactoryBean
后,就可以在配置文件中使用下面这种自定义的配置方式配置
Car Bean
了:
<bean id="car" class="com.baobaotao.factorybean.CarFactoryBean"
P:carInfo="法拉利
,400,2000000"/>
当调用getBean("car")
时,
Spring
通过反射机制发现
CarFactoryBean
实现了
FactoryBean
的接口,这时
Spring
容器就调用接口方法
CarFactoryBean#getObject()
方法返回。如果希望获取
CarFactoryBean
的实例,则需要在使用
getBean(beanName)
方法时在
beanName
前显示的加上
"&"
前缀:如
getBean("&car");
3、
区别
BeanFactory是个
Factory
,也就是
IOC
容器或对象工厂,
FactoryBean
是个
Bean
。在
Spring
中,所有的
Bean
都是由
BeanFactory(
也就是
IOC
容器
)
来进行管理的。但对
FactoryBean
而言,这个
Bean
不是简单的
Bean
,而是一个能生产或者修饰对象生成的工厂
Bean,
它的实现与设计模式中的工厂模式和修饰器模式类似。
分享到:
相关推荐
主要介绍了简单了解Spring中BeanFactory与FactoryBean的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
68-BeanFactory与FactoryBean1
主要介绍了Spring BeanFactory和FactoryBean区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要给大家介绍了关于Spring中BeanFactory与FactoryBean接口的区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Spring具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
今天小编就为大家分享一篇关于spring中的BeanFactory与FactoryBean的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
11,beanfactory和factorybean的区别? 12,用过的设计模式有哪些?介绍一下负责链模式。 算法题: 1,三个线程顺序打印十个数。 2,合并两个有序数组 反问:索引的隔离级别是什么? 面试过程中面试官会做详细记录...
BeanFactory和FactoryBean有什么区别; Spring中用到的设计模式; SPI 机制(Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制), 很多地方有用到: AOP Spring的AOP的底层实现原理; ...
在学习了书籍Spring5.0后,将自己的理解总结成了ppt,主要包含了IoC 和 DI,AOP,BeanFactory和FactoryBean,事务管理四个方面
BeanFactory和FactoryBean区别 Spring事务配置 SpringBoot面试题 Java相关 三大特性:封装、继承、多态 抽象类和接口区别 Object类下的方法 Collection类 反射 ...
这篇代码主要适用于我的博客,用来帮助理解Spring配置文件+FactoryBean的实例化过程。注意,这里是FactoryBean,而不是BeanFactory,下载资源要看清楚哈。
本篇文章主要介绍了Spring中的FactoryBean,如果一个bean的创建过程中涉及到很多其他的bean 和复杂的逻辑,用xml配置比较困难,这时可以考虑用FactoryBean
主要介绍了spring中FactoryBean中的getObject()方法实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
1. public interface BeanFactory { 2. 3. //这里是对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象, 4. //如果需要得到工厂本身,需要转义 5. String FACTORY...
例如,简单工厂模式通过BeanFactory展现,实现了松耦合和动态对象创建。工厂方法模式则通过FactoryBean接口展示,让对象创建更加灵活。单例模式保证了Bean实例的唯一性,而适配器模式和装饰器模式则提高了代码的可...
//这里是对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象, //如果需要得到工厂本身,需要转义 String FACTORY_BEAN_PREFIX = "&"; //这里根据bean的名字,在IOC容器中...
其中有大量一线大厂高频面试问题深度剖析,如MyBatis的Mapper接口底层原理,什么是FactoryBean,什么是BeanFactory?什么是BeanPostProcessor,什么是BeanFactoryPostProcessor?Service中注入的Mapper接口是什么...
FactoryBean和BeanFactory Spring事务处理机制 Spring JDBC Spring MVC九大组件 手动实现Spring MVC Spring5新特性 Mybatis 代码自动生成器 mybatis关联查询和嵌套查询 缓存使用场景及选择策略 Spring集成下的...
BeanFactory 使用控制反转 (IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 ☆ Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如...
java进阶源码分析专题常用设计模式线程与并发锁的使用深度理解synchronized、volatile、cas手写ASQSpring5IOC容器设计原理及高级特性AOP设计原理FactoryBean与BeanFactorySpring事务处理机制Spring JDK动态代理...
3.4 BeanFactory和ApplicationContext 3.4.1 BeanFactory介绍 3.4.2 ApplicationContext介绍 3.4.3 父子容器 3.5 Bean的生命周期 3.5.1 BeanFactory中Bean的生命周期 3.5.2 ApplicationContext中Bean的生命周期 3.6 ...