91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解Spring依賴注入:@Autowired,@Resource和@Inject區別與實現原理

發布時間:2020-09-17 07:57:00 來源:腳本之家 閱讀:187 作者:本人禿頂程序員 欄目:編程語言

一、spring依賴注入使用方式

  • @Autowired是spring框架提供的實現依賴注入的注解,主要支持在set方法,field,構造函數中完成bean注入,注入方式為通過類型查找bean,即byType的,如果存在多個同一類型的bean,則使用@Qualifier來指定注入哪個beanName的bean。
  • 與JDK的@Resource的區別:@Resource是基于bean的名字,即beanName,來從spring的IOC容器查找bean注入的,而@Autowried是基于類型byType來查找bean注入的。
  • 與JDK的@Inject的區別:@Inject也是基于類型來查找bean注入的,如果需要指定名稱beanName,則可以結合使用@Named注解,而@Autowired是結合@Qualifier注解來指定名稱beanName。

二、spring依賴注入注解的實現原理

注解處理器

  • 在spring框架內部實現當中,注解實現注入主要是通過bean后置處理器BeanPostProcessor接口的實現類來生效的。BeanPostProcessor后置處理器是在spring容器啟動時,創建bean對象實例后,馬上執行的,對bean對象實例進行加工處理。
  • @Autowired是通過BeanPostProcessor接口的實現類AutowiredAnnotationBeanPostProcessor來實現對bean對象對其他bean對象的依賴注入的;
  • @Resource和@Inject是通過BeanPostProcessor接口的實現類CommonAnnotationBeanPostProcessor來實現的,其中如名字所述,即公共注解CommonAnotation,CommonAnnotationBeanPostProcessor是spring中統一處理JDK中定義的注解的一個BeanPostProcessor。該類會處理的注解還包括@PostConstruct,@PreDestroy等。

注解處理器的激活條件

  • AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor添加到spring容器的BeanPostProcessor的條件,即激活這些處理器的條件如下:

1.基于xml的spring配置

  • 在對應的spring容器的配置xml文件中,如applicationContext.xml,添加<context:annotation-config />和<context:component-scan />,或者只使用<context:component-scan />。
  • 兩者的區別是<context:annotation-config />只查找并激活已經存在的bean,如通過xml文件的bean標簽生成加載到spring容器的,而不會去掃描如@Controller等注解的bean,查找到之后進行注入;而<context:component-scan />除了具有<context:annotation-config />的功能之外,還會去加載通過basePackages屬性指定的包下面的,默認為掃描@Controller,@Service,@Component,@Repository注解的類。不指定basePackages則是類路徑下面,或者如果使用注解@ComponentScan方式,則是當前類所在包及其子包下面。

2.基于配置類的spring配置

  • 如果是基于配置類而不是基于applicationContext.xml來對spring進行配置,如SpringBoot,則在內部使用的IOC容器實現為AnnotationConfigApplicationContext或者其派生類,在AnnotationConfigApplicationContext內部會自動創建和激活以上的BeanPostProcessor。
  • 如果同時存在基于xml的配置和配置類的配置,而在注入時間方面,基于注解的注入先于基于XML的注入,所以基于XML的注入會覆蓋基于注解的注入。

總結

  • @Autowired是Spring自帶的,@Inject和@Resource都是JDK提供的,其中@Inject是JSR330規范實現的,@Resource是JSR250規范實現的,而Spring通過BeanPostProcessor來提供對JDK規范的支持。
  • @Autowired、@Inject用法基本一樣,不同之處為@Autowired有一個required屬性,表示該注入是否是必須的,即如果為必須的,則如果找不到對應的bean,就無法注入,無法創建當前bean。
  • @Autowired、@Inject是默認按照類型匹配的,@Resource是按照名稱匹配的。如在spring-boot-data項目中自動生成的redisTemplate的bean,是需要通過byName來注入的。如果需要注入該默認的,則需要使用@Resource來注入,而不是@Autowired。
  • 對于@Autowire和@Inject,如果同一類型存在多個bean實例,則需要指定注入的beanName。@Autowired和@Qualifier一起使用,@Inject和@Name一起使用。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南安市| 高台县| 祥云县| 天全县| 阿拉善左旗| 乐昌市| 苏州市| 勐海县| 同江市| 开原市| 谢通门县| 淮南市| 南郑县| 潜山县| 安化县| 西乌| 乌鲁木齐县| 昌邑市| 汽车| 拜城县| 沛县| 尚志市| 阜南县| 崇阳县| 河南省| 乐昌市| 二连浩特市| 宁海县| 台前县| 抚顺县| 托克逊县| 武隆县| 诸城市| 乐陵市| 壶关县| 南投县| 合山市| 房产| 老河口市| 阜城县| 西华县|