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:

  1. /**
  2. *BeanPostProcessor 为每个bean实例化时提供个性化的修改,做些包装等
  3. **/
  4. public interface BeanPostProcessor {
  5. //在bean实例化前调用
  6. Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
  7. /**
  8. * 在bean实例化后调用,如果bean实现了InitializingBean,则在执行完*
  9. * 该接口的afterPropertiesSet方法后调用 ,如果实现了init-method则
  10. * 在执行完init-method后调用
  11. */
  12. Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
  13. }

InitializingBean

  1. /*
  2. *InitializingBean 为实现该接口的bean提供默认的初始化方法
  3. *也可以在xml配置bean的使用init-method来实现初始化方法
  4. */
  5. public interface InitializingBean {
  6. void afterPropertiesSet() throws Exception;
  7. }

InitializingBean只有一个方法,用于BeanFactory完成属性设置之后,执行自定义的初始化行为.
postProcessBeforeInitialization(Object bean, String beanName)方法会在Bean被Spring容器初始化时使用(在被管理的对象实例化后,由Spring容器进行的注入过程),2个参数分别是当前的bean实例及bean的名字.