AbstractApplicationContext.refresh()
容器啓動過程的最後一步:
AbstractApplicationContext.finishBeanFactoryInitialization -> DefaultListableBeanFactory.preInstantiateSingletons()
實時創建的實例前提判定條件是:非抽象 & 單例 & 非懶加載
創建bean先後過程:實例化 Instantiation
-> 屬性賦值 Populate
-> 初始化 Initialization
細化到子過程的步驟如下:
Constructor > @Autowired > BeanFactoryAware > ApplicationContextAware > @PostConstruct > InitializingBean > init-method
@Component
public class BService {
@Autowired
public CService cService;
}
@Service
public class CService {
@Autowired
public BService bService;
}
@Component
public class ExectSortComponent implements BeanFactoryAware, ApplicationContextAware, InitializingBean {
@Getter
private BService service;
public ExectSortComponent(BService b) {
System.out.println("這裏是Constructor");
}
@PostConstruct
public void init() {
System.out.println("這裏是@PostConstruct");
}
@Autowired
public void setService(BService service) {
this.service = service;
System.out.println("這裏是@Autowired");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("這裏是BeanFactoryAware");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("這裏是InitializingBean");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
{
System.out.println("這裏是ApplicationContextAware");
}
}
測試結果:
這裏是Constructor 這裏是@Autowired 這裏是BeanFactoryAware 這裏是ApplicationContextAware 這裏是@PostConstruct 這裏是InitializingBean
簡析
- Constructor 實例化階段
創建對象createBean
: createBeanInstance -> autowireConstructor
ExectSortComponent.<init>(BService) line: 28 NativeConstructorAccessorImpl.newInstance0(Constructor<?>, Object[]) line: not available [native method] NativeConstructorAccessorImpl.newInstance(Object[]) line: 62 DelegatingConstructorAccessorImpl.newInstance(Object[]) line: 45 Constructor<T>.newInstance(Object...) line: 423 BeanUtils.instantiateClass(Constructor<T>, Object...) line: 172 CglibSubclassingInstantiationStrategy(SimpleInstantiationStrategy).instantiate(RootBeanDefinition, String, BeanFactory, Constructor<?>, Object...) line: 117 ConstructorResolver.instantiate(String, RootBeanDefinition, Constructor<?>, Object[]) line: 300 ConstructorResolver.autowireConstructor(String, RootBeanDefinition, Constructor<?>[], Object[]) line: 285 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).autowireConstructor(String, RootBeanDefinition, Constructor<?>[], Object[]) line: 1341 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBeanInstance(String, RootBeanDefinition, Object[]) line: 1187 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 555 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 515 DefaultListableBeanFactory(AbstractBeanFactory).lambda$doGetBean$0(String, RootBeanDefinition, Object[]) line: 320
- @Autowired 屬性賦值階段
對象屬性注入populateBean
:[InstantiationAwareBeanPostProcessor]
AutowiredAnnotationBeanPostProcessor.postProcessProperties
ExectSortComponent.setService(BService) line: 39 NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] NativeMethodAccessorImpl.invoke(Object, Object[]) line: 62 DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43 Method.invoke(Object, Object...) line: 498 AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(Object, String, PropertyValues) line: 708 InjectionMetadata.inject(Object, String, PropertyValues) line: 90 AutowiredAnnotationBeanPostProcessor.postProcessProperties(PropertyValues, Object, String) line: 374 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).populateBean(String, RootBeanDefinition, BeanWrapper) line: 1411 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 592 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 515 DefaultListableBeanFactory(AbstractBeanFactory).lambda$doGetBean$0(String, RootBeanDefinition, Object[]) line: 320
- BeanFactoryAware 初始化階段
首先執行initializeBean
: invokeAwareMethods
這個invokeAwareMethods
過程, 只是處理了 BeanNameAware | BeanClassLoaderAware | BeanFactoryAware
, 而ApplicationContext
相關的Aware
都是通過BeanPostProcessor#postProcessBeforeInitialization()
實現的。
ExectSortComponent.setBeanFactory(BeanFactory) line: 45 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).invokeAwareMethods(String, Object) line: 1800 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).initializeBean(String, Object, RootBeanDefinition) line: 1765 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 593 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 515 DefaultListableBeanFactory(AbstractBeanFactory).lambda$doGetBean$0(String, RootBeanDefinition, Object[]) line: 320 2092709730.getObject() line: not available DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, ObjectFactory<?>) line: 222 DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, Class<T>, Object[], boolean) line: 318 DefaultListableBeanFactory(AbstractBeanFactory).getBean(String) line: 199
- ApplicationContextAware 初始化階段
接着initializeBean
: applyBeanPostProcessorsBeforeInitialization
執行接口方法BeanPostProcessor.postProcessBeforeInitialization
;這裏是ApplicationContextAwareProcessor
,在 AbstractApplicationContext.prepareBeanFactory
階段被注入。
ExectSortComponent.setApplicationContext(ApplicationContext) line: 56 ApplicationContextAwareProcessor.invokeAwareInterfaces(Object) line: 120 ApplicationContextAwareProcessor.postProcessBeforeInitialization(Object, String) line: 96 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).applyBeanPostProcessorsBeforeInitialization(Object, String) line: 414 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).initializeBean(String, Object, RootBeanDefinition) line: 1770 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 593 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 515 DefaultListableBeanFactory(AbstractBeanFactory).lambda$doGetBean$0(String, RootBeanDefinition, Object[]) line: 320
- @PostConstruct 初始化階段
隨後同樣也是initializeBean
: applyBeanPostProcessorsBeforeInitialization
執行接口方法BeanPostProcessor.postProcessBeforeInitialization
,這裏是CommonAnnotationBeanPostProcessor
。
(多個BeanPostProcessor
的執行順序取決於:在 AbstractApplicationContext.refresh()
-> AbstractApplicationContext.registerBeanPostProcessors
階段按優先級歸集 )
ExectSortComponent.init() line: 33 NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] NativeMethodAccessorImpl.invoke(Object, Object[]) line: 62 DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43 Method.invoke(Object, Object...) line: 498 InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(Object) line: 363 InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(Object, String) line: 307 CommonAnnotationBeanPostProcessor(InitDestroyAnnotationBeanPostProcessor).postProcessBeforeInitialization(Object, String) line: 136 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).applyBeanPostProcessorsBeforeInitialization(Object, String) line: 414 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).initializeBean(String, Object, RootBeanDefinition) line: 1770 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 593 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 515 DefaultListableBeanFactory(AbstractBeanFactory).lambda$doGetBean$0(String, RootBeanDefinition, Object[]) line: 320
- InitializingBean 初始化階段
最後執行initializeBean
: invokeInitMethods
來調用方法 InitializingBean.afterPropertiesSet()
ExectSortComponent.afterPropertiesSet() line: 50 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).invokeInitMethods(String, Object, RootBeanDefinition) line: 1837 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).initializeBean(String, Object, RootBeanDefinition) line: 1774 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 593 DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 515 DefaultListableBeanFactory(AbstractBeanFactory).lambda$doGetBean$0(String, RootBeanDefinition, Object[]) line: 320