BeanFactory和FactoryBean的区别
BeanFactory是IOC容器的核心接口,是一个工厂类,负责生产和管理bean,为IOC容器提供了最基本的规范,实现类有:ApplicationContext, XmlBeanFactory,DefaultListableBeanFactory。
FactoryBean是一个工厂bean。
Spring有两种bean,一种是普通的bean, 一种是实现了FactoryBean的bean,Factorybean管理的bean实际上也是交给Spring进行管理、实例化和配置。
IOC中的Bean实现了FactoryBean,通过getBean(String beanName)获取到的bean对象不是FactoryBean的实现类对象,而是这个实现类中getObject返回的对象。要想获取FactoryBean实现类,就要getbean的时候,beanname前面加上&。
BeanFactory和ApplicationContext有啥区别?
- 都可以当作Spring的容器
BeanFactory是IOC核心底层接口,ApplicationContext是BeanFactory的子类,除了提供BeanFactory所具体的功能以外,还提供了更加完整的框架功能,比方说国际化,资源文件访问等。
BeabFactory采用延迟加载的形式来注入bean,只有使用某个bean的getBean的时候,才会对该bean进行实例化。这样我们不能提前发现一些存在的问题提,如果bean的某一个属性没有注入,BeanFactory加载后,直到第一次getbean方法才会抛出异常。 ApplicationContext在容器启动的时候,一次性创建所有的bean,这样,容器启动的时候,就会发现存在的配置错误。唯一的不足就是占用内存空间,当程序Bean较多的时候,程序启动较慢。
都支持BeanPostProcessor,BeanFactoryPostProcessor, 区别是BeanFactory需要手动注册,ApplicationContext是自动注册。
BeanPostProcessor和InitializingBean的区别
BeanPostProcessor:
/**
*BeanPostProcessor 为每个bean实例化时提供个性化的修改,做些包装等
**/
public interface BeanPostProcessor {
//在bean实例化前调用
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
/**
* 在bean实例化后调用,如果bean实现了InitializingBean,则在执行完*
* 该接口的afterPropertiesSet方法后调用 ,如果实现了init-method则
* 在执行完init-method后调用
*/
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}
InitializingBean
/*
*InitializingBean 为实现该接口的bean提供默认的初始化方法
*也可以在xml配置bean的使用init-method来实现初始化方法
*/
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
InitializingBean只有一个方法,用于BeanFactory完成属性设置之后,执行自定义的初始化行为.
postProcessBeforeInitialization(Object bean, String beanName)方法会在Bean被Spring容器初始化时使用(在被管理的对象实例化后,由Spring容器进行的注入过程),2个参数分别是当前的bean实例及bean的名字.