日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AnnotationConfigApplicationContext 通过调用注解Bean 定义读取器

發(fā)布時(shí)間:2024/4/13 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AnnotationConfigApplicationContext 通过调用注解Bean 定义读取器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

AnnotatedBeanDefinitionReader 的register()方法向容器注冊(cè)指定的注解Bean,注解Bean 定義讀取器向容器注冊(cè)注解Bean 的源碼如下:

//注冊(cè)多個(gè)注解Bean定義類 public void register(Class<?>... annotatedClasses) {for (Class<?> annotatedClass : annotatedClasses) {registerBean(annotatedClass);} }//注冊(cè)一個(gè)注解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定義讀取器注冊(cè)注解Bean定義的入口方法 @SuppressWarnings("unchecked") public void registerBean(Class<?> annotatedClass, Class<? extends Annotation>... qualifiers) {doRegisterBean(annotatedClass, null, null, qualifiers); }//Bean定義讀取器向容器注冊(cè)注解Bean定義類 @SuppressWarnings("unchecked") public void registerBean(Class<?> annotatedClass, String name, Class<? extends Annotation>... qualifiers) {doRegisterBean(annotatedClass, null, name, qualifiers); }//Bean定義讀取器向容器注冊(cè)注解Bean定義類 <T> void doRegisterBean(Class<T> annotatedClass, @Nullable Supplier<T> instanceSupplier, @Nullable String name,@Nullable Class<? extends Annotation>[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) {//根據(jù)指定的注解Bean定義類,創(chuàng)建Spring容器中對(duì)注解Bean的封裝的數(shù)據(jù)結(jié)構(gòu)AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass);if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {return;}abd.setInstanceSupplier(instanceSupplier);//解析注解Bean定義的作用域,若@Scope("prototype"),則Bean為原型類型;//若@Scope("singleton"),則Bean為單態(tài)類型ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);//為注解Bean定義設(shè)置作用域abd.setScope(scopeMetadata.getScopeName());//為注解Bean定義生成Bean名稱String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));//處理注解Bean定義中的通用注解AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);//如果在向容器注冊(cè)注解Bean定義時(shí),使用了額外的限定符注解,則解析限定符注解。//主要是配置的關(guān)于autowiring自動(dòng)依賴注入裝配的限定條件,即@Qualifier注解//Spring自動(dòng)依賴注入裝配默認(rèn)是按類型裝配,如果使用@Qualifier則按名稱if (qualifiers != null) {for (Class<? extends Annotation> qualifier : qualifiers) {//如果配置了@Primary注解,設(shè)置該Bean為autowiring自動(dòng)依賴注入裝//配時(shí)的首選if (Primary.class == qualifier) {abd.setPrimary(true);}//如果配置了@Lazy注解,則設(shè)置該Bean為非延遲初始化,如果沒有配置,//則該Bean為預(yù)實(shí)例化else if (Lazy.class == qualifier) {abd.setLazyInit(true);}//如果使用了除@Primary和@Lazy以外的其他注解,則為該Bean添加一//個(gè)autowiring自動(dòng)依賴注入裝配限定符,該Bean在進(jìn)autowiring//自動(dòng)依賴注入裝配時(shí),根據(jù)名稱裝配限定符指定的Beanelse {abd.addQualifier(new AutowireCandidateQualifier(qualifier));}}}for (BeanDefinitionCustomizer customizer : definitionCustomizers) {customizer.customize(abd);}//創(chuàng)建一個(gè)指定Bean名稱的Bean定義對(duì)象,封裝注解Bean定義類數(shù)據(jù)BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);//根據(jù)注解Bean定義類中配置的作用域,創(chuàng)建相應(yīng)的代理對(duì)象definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);//向IOC容器注冊(cè)注解Bean類定義對(duì)象BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry); }

從上面的源碼我們可以看出,注冊(cè)注解Bean 定義類的基本步驟:

a、需要使用注解元數(shù)據(jù)解析器解析注解Bean 中關(guān)于作用域的配置。

b、使用AnnotationConfigUtils 的processCommonDefinitionAnnotations()方法處理注解Bean 定義類中通用的注解。

c、使用AnnotationConfigUtils 的applyScopedProxyMode()方法創(chuàng)建對(duì)于作用域的代理對(duì)象

d、通過BeanDefinitionReaderUtils 向容器注冊(cè)Bean。

?

總結(jié)

以上是生活随笔為你收集整理的AnnotationConfigApplicationContext 通过调用注解Bean 定义读取器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。