think in Spring 2

  Spring 中的

BeanDefinition  RootBeanDefinition    GenericBeanDefinition    ScannedGenericBeanDefinition   MergedBeanDefinition

BeanDefinitionRegistry

FactoryBean 

BeanFactory

ApplicationContext 

BeanPostProcessor

BeanFactoryPostProcessor 

xxxAware接口

xxxAwareBeanPostProcessor

PropertyValues

  涉及到的

类加载

cglib

反射:  PropertyDescriptor

  脉络

确定用于 bean 实例化的构造函数 和 传给构造函数的参数的值。  比如一个类有三个构造函数,怎么确定用哪一个??

 

 

 

FactoryBean:

  一般情况下,Spring 通过反射机制利用 bean 的  class 属性指定实现类来实例化 bean。而 FactoryBean 是一种特殊的 bean,它是个工厂 bean,可以自己创建 bean 实例,如果一个类实现了 FactoryBean 接口,则该类可以自己定义创建实例对象的方法,只需要实现它的 getObject() 方法。

  注:很多中间件都利用 FactoryBean 来进行扩展。   为什么要采用这种方式??? <<<<<,,

例如以下例子:

public class AppleFactoryBean implements FactoryBean<Apple> {
 
    @Override
    public Apple getObject() throws Exception {
        Apple apple = new Apple();
        apple.setName("bigApple");
        return apple;
    }
 
    @Override
    public Class<?> getObjectType() {
        return Apple.class;
    }
 
    @Override
    public boolean isSingleton() {
        return true;
    }
}

为了区分 “FactoryBean” 和 “FactoryBean 创建的 bean 实例”,Spring 使用了 “&” 前缀。假设我们的 beanName 为 apple,则 getBean("apple") 获得的是 AppleFactoryBean 通过 getObject() 方法创建的 bean 实例;而 getBean("&apple") 获得的是 AppleFactoryBean 本身。

 

参考文档:

  

 

posted @ 2020-12-02 21:06  你眼里的星辰  阅读(57)  评论(0)    收藏  举报