解讀@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’這是此類的一個實例,請保留該類,并在我詢問時將其還給我’。@Autowired
說“請給我一個該類的實例,例如,我@Bean之前用注釋創(chuàng)建的一個實例”。
那有意義嗎?在第一個示例中,你要讓Spring給你一個的實例BookingService,但是你從未創(chuàng)建一個實例,因此Spring沒有任何東西可以給你。在第二個示例中,你將創(chuàng)建一個的新實例BookingService,將其告知Spring,然后在該main()方法中要求其返回。
如果需要,可以從第二種main()方法中刪除另外兩行,并結合以下兩個示例:
@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
利用。
這將是一個毫無意義的示例,因為你都在同一個類中使用它們,但是如果你@Bean
在一個類中定義了該類,而在另一個類中定義了它,則它將變得很有用@Autowired
。
@Resource和@Autowired的區(qū)別
- @Autowired會先按byType去找,如果沒找到,則會按照byName去找
- @Resource會先按byName去找,如果沒找到則會byType去找。如果設置了name屬性,則只會按byName去找,找不到就報錯。
@Resource(name = "studentServiceImpl") private PersonService personService;
什么時候用Autowired、Resource?
Autowired
:效率低下,先按類型查找,再按名字查找Resource
:按名字查找,后面要跟參數(shù)name,好處:當有多個Impl實現(xiàn)類時,可以通name快速找到
當只有一個Impl實類的時候,隨便用哪個都差不多,>=2的時候,最好用@Resource,比@Autowired@Qualifier()效率高
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java web spring異步方法實現(xiàn)步驟解析
這篇文章主要介紹了Java web spring異步方法實現(xiàn)步驟解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08IDEA 2023創(chuàng)建JSP項目的完整步驟教程
這篇文章主要介紹了IDEA 2023創(chuàng)建JSP項目的完整步驟教程,創(chuàng)建項目需要經(jīng)過新建項目、設置項目名稱和路徑、選擇JDK版本、添加模塊和工件、配置Tomcat服務器等步驟,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2024-10-10Java數(shù)據(jù)類型之細講char類型與編碼關系
這幾天一直在復習Java基礎知識,特地寫了一篇文章來做一下筆記,文中有非常詳細的圖文示例,對正在學習java的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05mybatis分割字符串并循環(huán),實現(xiàn)in多個參數(shù)的操作
這篇文章主要介紹了mybatis分割字符串并循環(huán),實現(xiàn)in多個參數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06Liquibase結合SpringBoot使用實現(xiàn)數(shù)據(jù)庫管理功能
Liquibase 是一個強大的數(shù)據(jù)庫管理工具,它幫助你通過自動化管理數(shù)據(jù)庫的變更、版本控制、和回滾,簡化了開發(fā)中的數(shù)據(jù)庫遷移工作,這篇文章主要介紹了Liquibase結合SpringBoot使用實現(xiàn)數(shù)據(jù)庫管理,需要的朋友可以參考下2024-12-12java批量下載將多個文件(minio中存儲)壓縮成一個zip包代碼示例
在Java應用程序中有時我們需要從多個URL地址下載文件,并將這些文件打包成一個Zip文件進行批量處理或傳輸,這篇文章主要給大家介紹了關于java批量下載將多個文件(minio中存儲)壓縮成一個zip包的相關資料,需要的朋友可以參考下2023-11-11