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 本身。
参考文档:
浙公网安备 33010602011771号