反射创建bean以及初始化
1 |
|
1 | public void preInstantiateSingletons() throws BeansException { |
1 | public Object getBean(String name) throws BeansException { |
doGetBean
1 | protected <T> T doGetBean( |
1 | protected Object createBean(final String beanName, final RootBeanDefinition mbd, final Object[] args){ |
doCreateBean
1 | protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) { |
createBeanInstance
1 | protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) { |
1 | protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) { |
instantiate
1 | public Object instantiate(RootBeanDefinition bd, String beanName, BeanFactory owner) { |
instantiate方法主要做两件事
- 确定Constructor或者factory-method
- 利用Constructor,反射创建bean实例
initializeBean
bean创建完后,容器会对它进行初始化,包括后处理的调用,init-method的调用等
1 | protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) { |
由此可见,initializeBean(),也就是bean的初始化流程为
- 回调各种aware method,如BeanNameAware,将容器中相关引用注入到bean中,供bean使用
- 回调beanPostProcessor的postProcessBeforeInitialization(), 后处理器的初始化前置调用
- 回调init-method, 注解和XML中都可以声明
- 回调beanPostProcessor的postProcessAfterInitialization()方法,后处理器的初始化后置调用。