中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

詳解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

加查县| 灵川县| 澳门| 清流县| 扎囊县| 南靖县| 育儿| 平原县| 体育| 沿河| 寻乌县| 宁明县| 墨竹工卡县| 崇礼县| 辽阳县| 苏尼特右旗| 东莞市| 扶绥县| 平邑县| 新干县| 辉南县| 深泽县| 隆德县| 高陵县| 崇仁县| 额济纳旗| 深水埗区| 施秉县| 昌邑市| 周宁县| 平山县| 金堂县| 合肥市| 贵阳市| 敖汉旗| 贵港市| 融水| 云霄县| 崇州市| 沙河市| 喀喇沁旗|