AnnotationConfigApplicationContext 通过调用注解Bean 定义读取器
生活随笔
收集整理的這篇文章主要介紹了
AnnotationConfigApplicationContext 通过调用注解Bean 定义读取器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
AnnotatedBeanDefinitionReader 的register()方法向容器注冊指定的注解Bean,注解Bean 定義讀取器向容器注冊注解Bean 的源碼如下:
//注冊多個注解Bean定義類 public void register(Class<?>... annotatedClasses) {for (Class<?> annotatedClass : annotatedClasses) {registerBean(annotatedClass);} }//注冊一個注解Bean定義類 public void registerBean(Class<?> annotatedClass) {doRegisterBean(annotatedClass, null, null, null); }public <T> void registerBean(Class<T> annotatedClass, @Nullable Supplier<T> instanceSupplier) {doRegisterBean(annotatedClass, instanceSupplier, null, null); }public <T> void registerBean(Class<T> annotatedClass, String name, @Nullable Supplier<T> instanceSupplier) {doRegisterBean(annotatedClass, instanceSupplier, name, null); }//Bean定義讀取器注冊注解Bean定義的入口方法 @SuppressWarnings("unchecked") public void registerBean(Class<?> annotatedClass, Class<? extends Annotation>... qualifiers) {doRegisterBean(annotatedClass, null, null, qualifiers); }//Bean定義讀取器向容器注冊注解Bean定義類 @SuppressWarnings("unchecked") public void registerBean(Class<?> annotatedClass, String name, Class<? extends Annotation>... qualifiers) {doRegisterBean(annotatedClass, null, name, qualifiers); }//Bean定義讀取器向容器注冊注解Bean定義類 <T> void doRegisterBean(Class<T> annotatedClass, @Nullable Supplier<T> instanceSupplier, @Nullable String name,@Nullable Class<? extends Annotation>[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) {//根據指定的注解Bean定義類,創建Spring容器中對注解Bean的封裝的數據結構AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass);if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {return;}abd.setInstanceSupplier(instanceSupplier);//解析注解Bean定義的作用域,若@Scope("prototype"),則Bean為原型類型;//若@Scope("singleton"),則Bean為單態類型ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);//為注解Bean定義設置作用域abd.setScope(scopeMetadata.getScopeName());//為注解Bean定義生成Bean名稱String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));//處理注解Bean定義中的通用注解AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);//如果在向容器注冊注解Bean定義時,使用了額外的限定符注解,則解析限定符注解。//主要是配置的關于autowiring自動依賴注入裝配的限定條件,即@Qualifier注解//Spring自動依賴注入裝配默認是按類型裝配,如果使用@Qualifier則按名稱if (qualifiers != null) {for (Class<? extends Annotation> qualifier : qualifiers) {//如果配置了@Primary注解,設置該Bean為autowiring自動依賴注入裝//配時的首選if (Primary.class == qualifier) {abd.setPrimary(true);}//如果配置了@Lazy注解,則設置該Bean為非延遲初始化,如果沒有配置,//則該Bean為預實例化else if (Lazy.class == qualifier) {abd.setLazyInit(true);}//如果使用了除@Primary和@Lazy以外的其他注解,則為該Bean添加一//個autowiring自動依賴注入裝配限定符,該Bean在進autowiring//自動依賴注入裝配時,根據名稱裝配限定符指定的Beanelse {abd.addQualifier(new AutowireCandidateQualifier(qualifier));}}}for (BeanDefinitionCustomizer customizer : definitionCustomizers) {customizer.customize(abd);}//創建一個指定Bean名稱的Bean定義對象,封裝注解Bean定義類數據BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);//根據注解Bean定義類中配置的作用域,創建相應的代理對象definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);//向IOC容器注冊注解Bean類定義對象BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry); }從上面的源碼我們可以看出,注冊注解Bean 定義類的基本步驟:
a、需要使用注解元數據解析器解析注解Bean 中關于作用域的配置。
b、使用AnnotationConfigUtils 的processCommonDefinitionAnnotations()方法處理注解Bean 定義類中通用的注解。
c、使用AnnotationConfigUtils 的applyScopedProxyMode()方法創建對于作用域的代理對象
d、通過BeanDefinitionReaderUtils 向容器注冊Bean。
?
總結
以上是生活随笔為你收集整理的AnnotationConfigApplicationContext 通过调用注解Bean 定义读取器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 定位Bean 扫描路径
- 下一篇: AnnotationScopeMetad