最近有看一些面试题,很多框架都有提到三者的关系和区别。所以今天打算看一下。
beafactory是Spring IOC中的基础容器,用来解析BeanDefination存放bean的容器,还会对外提供一些操作bean的接口,AplicationContext是BeanFactory的扩展容器,基于BeanFactory 将其和其他组件整合到了一起。而factoryBean是以bean结尾的我们就可以知道它是以bean结尾的,所以我们可以认为他是一个特殊的bean,可以用来生产bean的一个bean,有点绕口。
public interface BeanFactory {
//对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象,
//如果需要得到工厂本身,需要转义
String FACTORY_BEAN_PREFIX = "&";
//根据bean的名字,获取在IOC容器中得到bean实例
Object getBean(String name) throws BeansException;
//根据bean的名字和Class类型来得到bean实例,增加了类型安全验证机制。
<T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
//提供对bean的检索,看看是否在IOC容器有这个名字的bean
boolean containsBean(String name);
//根据bean名字得到bean实例,并同时判断这个bean是不是单例
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
//得到bean实例的Class类型
@Nullable
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
//得到bean的别名,如果根据别名检索,那么其原名也会被检索出来
String[] getAliases(String name);
}
package org.springframework.beans.factory;
public interface FactoryBean<T> {
T getObject() throws Exception;
Class<?> getObjectType();
boolean isSingleton();
}
/**
* @authoryuanxindong
* @date: 2020/6/9 8:43 下午
*/
public class FactoryBeanStudy implements FactoryBean<Person> {
private String personInfo;
@Override
public Person getObject() throws Exception {
Person person = new Person();
String[] split = personInfo.split(",");
String s = split[1];
person.setName(s);
return person ;
}
@Override
public Class<?> getObjectType() {
return Person.class;
}
@Override
public boolean isSingleton() {
return false;
}
public void setPersonInfo(String personInfo) {
this.personInfo = personInfo;
}
}
还有结合上面的依赖图可知:
ApplicationContext(扩展的Bean容器对外接口) 和 factoryBean(就是一个特殊的Bean) 都依赖 beanFactory(基础容器对外接口)
https://www.cnblogs.com/xiaoxi/p/5846416.html https://www.cnblogs.com/aspirant/p/9082858.html