1. 程式人生 > 其它 >Spring原始碼-03-容器建立

Spring原始碼-03-容器建立

Spring原始碼-03-容器建立

註解Bean方式

public class AnnotationCtxMain02 {

	public static void main(String[] args) {
		new AnnotationConfigApplicationContext(MyCfg02.class);
	}
}
// AnnotationConfigApplicationContext.java
public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
		/**
		 * 完成容器的基礎元件初始化
		 *     - beanFactory
		 *         - 實現是DefaultListableBeanFactory
		 *     - reader
		 *         - 註解Bean讀取
		 *         - BeanDefinition注入容器
		 *     - scanner
		 *         - 指定路徑掃包
		 *         - BeanDefinition注入容器
		 */
		this();
		this.register(componentClasses); // Bean讀取器讀取註解Bean將類資訊封裝BeanDefinition注入容器 配置類
		/**
		 * 到此為止完成了準備工作
		 *     - 向IoC容器中註冊了用於處理註解Bean這種場景下的後置處理器
		 *     - 向IoC容器中註冊了使用者配置類
		 *
		 * 
		 */
		super.refresh();
	}

容器建立主要3個步驟

  • 基礎元件初始化
  • 注入BeanDefinition
  • refresh

一 基礎元件

// AnnotationConfigApplicationContext.java
public AnnotationConfigApplicationContext() {
		super();
		StartupStep createAnnotatedBeanDefReader = this.getApplicationStartup().start("spring.context.annotated-bean-reader.create");
		this.reader = new AnnotatedBeanDefinitionReader(this); // 註解Bean讀取器
		createAnnotatedBeanDefReader.end();
		this.scanner = new ClassPathBeanDefinitionScanner(this); // 路徑掃包器
	}
// GenericApplicationContext.java
public GenericApplicationContext() {
		super();
		this.beanFactory = new DefaultListableBeanFactory();
	}
// AbstractApplicationContext.java
public AbstractApplicationContext() {
		this.resourcePatternResolver = getResourcePatternResolver();
	}

也就是如圖

二 註解Bean讀取器

傳送

完成了2個工作

  • 向IoC容器中註冊了用於處理註解Bean這種場景下的後置處理器
  • 向IoC容器中註冊了使用者配置類
後置處理器類
ConfigurationClassPostProcessor
AutowiredAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor
InitDestroyAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor
EventListenerMethodProcessor
DefaultEventListenerFactory

三 refresh

傳送