您好,登錄后才能下訂單哦!
本篇內容主要講解“Spring的@Autowired,@Resource和@Inject實現原理是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Spring的@Autowired,@Resource和@Inject實現原理是什么”吧!
一、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的注入會覆蓋基于注解的注入。
到此,相信大家對“Spring的@Autowired,@Resource和@Inject實現原理是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。