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

