解讀@Bean和@Autowired、@Resource之間的區(qū)別
@Bean和@Autowired、@Resource的區(qū)別
@Bean 修飾的方法表示初始化一個(gè)對(duì)象并交由Spring IOC去管理,@Bean 只能和@Component @Repository @Controller @Service @Configration 配合使用.
@Autowired 可修飾變量和方法,用于完成自動(dòng)裝配(將需要的外部資源注入)
@Resource是java提供的注解,和@Autowired類似
@Bean和@Autowired的區(qū)別
網(wǎng)站上看到一個(gè)問題:
為什么@Autowired在這種情況下不能使用?
@SpringBootApplication public class Application { @Autowired BookingService bookingService; public static void main(String[] args) { bookingService.book("Alice", "Bob", "Carol"); } }
但可以使用 @Bean
@SpringBootApplication public class Application { @Bean BookingService bookingService() { return new BookingService(); } public static void main(String[] args) { ApplicationContext ctx = SpringApplication.run(Application.class, args); BookingService bookingService = ctx.getBean(BookingService.class); bookingService.book("Alice", "Bob", "Carol"); } }
區(qū)別:
簡(jiǎn)單地解釋:
@Bean
告訴Spring’這是此類的一個(gè)實(shí)例,請(qǐng)保留該類,并在我詢問時(shí)將其還給我’。@Autowired
說“請(qǐng)給我一個(gè)該類的實(shí)例,例如,我@Bean之前用注釋創(chuàng)建的一個(gè)實(shí)例”。
那有意義嗎?在第一個(gè)示例中,你要讓Spring給你一個(gè)的實(shí)例BookingService,但是你從未創(chuàng)建一個(gè)實(shí)例,因此Spring沒有任何東西可以給你。在第二個(gè)示例中,你將創(chuàng)建一個(gè)的新實(shí)例BookingService,將其告知Spring,然后在該main()方法中要求其返回。
如果需要,可以從第二種main()方法中刪除另外兩行,并結(jié)合以下兩個(gè)示例:
@SpringBootApplication public class Application { @Autowired BookingService bookingService; @Bean BookingService bookingService() { return new BookingService(); } public static void main(String[] args) { bookingService.book("Alice", "Bob", "Carol"); } }
在這種情況下,@Bean
注釋為Spring提供了BookingService
,并加以@Autowired
利用。
這將是一個(gè)毫無意義的示例,因?yàn)槟愣荚谕粋€(gè)類中使用它們,但是如果你@Bean
在一個(gè)類中定義了該類,而在另一個(gè)類中定義了它,則它將變得很有用@Autowired
。
@Resource和@Autowired的區(qū)別
- @Autowired會(huì)先按byType去找,如果沒找到,則會(huì)按照byName去找
- @Resource會(huì)先按byName去找,如果沒找到則會(huì)byType去找。如果設(shè)置了name屬性,則只會(huì)按byName去找,找不到就報(bào)錯(cuò)。
@Resource(name = "studentServiceImpl") private PersonService personService;
什么時(shí)候用Autowired、Resource?
Autowired
:效率低下,先按類型查找,再按名字查找Resource
:按名字查找,后面要跟參數(shù)name,好處:當(dāng)有多個(gè)Impl實(shí)現(xiàn)類時(shí),可以通name快速找到
當(dāng)只有一個(gè)Impl實(shí)類的時(shí)候,隨便用哪個(gè)都差不多,>=2的時(shí)候,最好用@Resource,比@Autowired@Qualifier()效率高
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java web spring異步方法實(shí)現(xiàn)步驟解析
這篇文章主要介紹了Java web spring異步方法實(shí)現(xiàn)步驟解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08IDEA 2023創(chuàng)建JSP項(xiàng)目的完整步驟教程
這篇文章主要介紹了IDEA 2023創(chuàng)建JSP項(xiàng)目的完整步驟教程,創(chuàng)建項(xiàng)目需要經(jīng)過新建項(xiàng)目、設(shè)置項(xiàng)目名稱和路徑、選擇JDK版本、添加模塊和工件、配置Tomcat服務(wù)器等步驟,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10Java數(shù)據(jù)類型之細(xì)講char類型與編碼關(guān)系
這幾天一直在復(fù)習(xí)Java基礎(chǔ)知識(shí),特地寫了一篇文章來做一下筆記,文中有非常詳細(xì)的圖文示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05java實(shí)現(xiàn)的二級(jí)聯(lián)動(dòng)菜單效果
這篇文章主要介紹了java實(shí)現(xiàn)的二級(jí)聯(lián)動(dòng)菜單效果,結(jié)合實(shí)例形式分析了java前臺(tái)頁(yè)面布局及與后臺(tái)交互構(gòu)造聯(lián)動(dòng)菜單的相關(guān)技巧,需要的朋友可以參考下2016-08-08Spring防止重復(fù)點(diǎn)擊的兩種實(shí)現(xiàn)方法
頁(yè)面重復(fù)提交導(dǎo)致的問題就是數(shù)據(jù)被重復(fù)保存,我們經(jīng)常會(huì)誤觸點(diǎn)擊兩次,所以本文小編給大家介紹了Spring防止重復(fù)點(diǎn)擊的兩種實(shí)現(xiàn)方法,需要的朋友可以參考下2025-01-01mybatis分割字符串并循環(huán),實(shí)現(xiàn)in多個(gè)參數(shù)的操作
這篇文章主要介紹了mybatis分割字符串并循環(huán),實(shí)現(xiàn)in多個(gè)參數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Liquibase結(jié)合SpringBoot使用實(shí)現(xiàn)數(shù)據(jù)庫(kù)管理功能
Liquibase 是一個(gè)強(qiáng)大的數(shù)據(jù)庫(kù)管理工具,它幫助你通過自動(dòng)化管理數(shù)據(jù)庫(kù)的變更、版本控制、和回滾,簡(jiǎn)化了開發(fā)中的數(shù)據(jù)庫(kù)遷移工作,這篇文章主要介紹了Liquibase結(jié)合SpringBoot使用實(shí)現(xiàn)數(shù)據(jù)庫(kù)管理,需要的朋友可以參考下2024-12-12詳解堆排序算法原理及Java版的代碼實(shí)現(xiàn)
如果將堆理解為二叉樹,那么樹中任一非葉結(jié)點(diǎn)的關(guān)鍵字均不大于(或不小于)其左右孩子(若存在)結(jié)點(diǎn)的關(guān)鍵字,堆排序的時(shí)間復(fù)雜度為O(N*logN),這里我們就來詳解堆排序算法原理及Java版的代碼實(shí)現(xiàn)2016-06-06java批量下載將多個(gè)文件(minio中存儲(chǔ))壓縮成一個(gè)zip包代碼示例
在Java應(yīng)用程序中有時(shí)我們需要從多個(gè)URL地址下載文件,并將這些文件打包成一個(gè)Zip文件進(jìn)行批量處理或傳輸,這篇文章主要給大家介紹了關(guān)于java批量下載將多個(gè)文件(minio中存儲(chǔ))壓縮成一個(gè)zip包的相關(guān)資料,需要的朋友可以參考下2023-11-11