Bean的創建過程

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    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章