前言
本人是一個普通程序猿!分享一點自己的見解,如果有錯誤的地方歡迎各位大佬蒞臨指導,如果你也對編程感興趣的話,互關一下,以后互相學習,共同進步。這篇文章能夠幫助到你的話,勞請大家點贊轉發(fā)支持一下!
一、存儲 Bean 對象
上篇文章中,向Spring容器中添加對象,還要去配置文件里手動添加,這貌似并不比new便捷。
而Spring項目中呢,往往采用更加便捷的 “注解” 來向Spring容器中添加對象。
類注解
要想將 對象存儲到 Spring 中,一共有兩種注解類型可以實現:
- 類注解: @Controller、@Service、@Repository、@Component、@Configuration 。
- 方法注解: @Bean。
為什么有五個類注解
類注解一共有五個,但是這五個類注解的功能可以說是一模一樣。
那么功能一樣,有一個不就好了,為什么還要有五個呢?
這其中的道理,就好像筆記本類型,有輕薄本,辦公本,游戲本。
他們不也都是筆記本嗎,為什么還要分成三種呢?
因為人們可以從這個類型就看出筆記本更適合干什么。
輕薄本,更加輕薄,便于攜帶。
辦公本,更加適合辦公。
游戲本,性能更強,適用于打游戲,與一些需要生產力的場景(視頻渲染,建模等)。所以為什么會有五個功能相同的類注解呢?
在一個項目的開發(fā)中,往往需要多名程序員協(xié)同開發(fā),
而這五個類注解的目的就是為了讓 程序員看到類注解,就能直接了解當前類的用途。
- @Controller:業(yè)務邏輯層,負責校驗參數的合法性。
- @Service:服務層,負責業(yè)務組裝。
- @Repository:數據持久層,負責實際業(yè)務處理。
- @Configuration:配置層,負責存儲配置類。
- @Component:工具層,負責存儲工具類。
查看 @Controller、@Service、@Repository、@Configuration 的源碼可以發(fā)現,這些注解里面都有注解@Component,所以 這四個注解都是@Component的子類 。
- 五個類注解功能相同,下面就只拿@Controller注解做例子講解了!?。?
使用類注解存儲對象
配置掃描路徑(重中之重)
在配置文件(這里我的配置文件是spring-config.xml)中,添加一行代碼即可。
<content:component-scan base-package=""></content:component-scan>
此時Spring就 只會掃描這個路徑對應的包中的注解,以及子包中有注解的類 ,并將注解類添加到容器中。
舉例
我路徑對應的包是test包,所以此時:
Spring
只會掃描test包中的類,以及test的子包 demo包中的類。不會掃描與test包同級的School類,也不會掃描與test包同級的example包中的類。
掃描路徑也是為了提升性能,在實際開發(fā)中,一個項目可能包含許多類,如果都掃描的話,那么就會影響性能,因此就有了掃描路徑,只掃描該路徑下的類。
- 注意注意注意!!! 不在掃描路徑的包中的類,即便是這個包上一級中的類,同級的類,同一級包中的類,即便添加了注解,也不會被存儲到Spring容器中!?。。。。。。。。?!
-
可以配置多個掃描路徑?。?!Spring會同時將這些路徑中的注解放到容器中。
添加注解存儲 Bean 對象
五各類注解的使用方法相同,只拿@Controller注解做示范,想用其他注解,使用方法相同。
添加注解存儲對象有兩種方式:
注解中設置名字
這個value相當于給注解設置名字,然后根據名字在容器中查找取出對象。
有兩種設置名字的寫法,這兩種寫法都一樣。
注解中不給參數
此時就會根據類名來給你一個默認的名字。下面咱們看下給默認名字方法的源碼。
如果 類名的第一個字母與第二個字母都是大寫 ,那么他的 默認名字是原類名 。
如果 類名的第一個字母與第二個字母有一個不是大寫或都不是大寫 ,那么他的 默認名字是首字母小寫的類名。
方法注解
配置掃描路徑(重中之重)
上述類注解配置掃描路徑,這一個掃描路徑可以同時供類注解與方法注解使用,配置方法與類注解一致。
使用方法注解存儲對象
類注解是添加到某個類上的,而方法注解是放到某個方法上的,如以下代碼的實現。
方法注解的作用,就是將這個方法返回的對象存儲到容器中。
拿下面兩個類舉例:
方法注解有兩點需要注意
1??方法注解要搭配類注解使用。不搭配類注解使用
>
可以看到不搭配類注解使用就會報錯
Spring只會掃描添加了類注解的類 里面是否有方法注解。
搭配類注解使用
方法注解搭配類注解時,類注解同樣生效,被類注解標記的類也會被存入容器中 。
2??添加方法注解的方法不能有參數(任何類型的參數都不行)。
下面咱們就來講一講方法注解的命名吧!
方法注解@Bean,可以設置value與name設置哪個都行,都當名字用。
值得注意的是方法注解可以設置多個名字,當然也可以不設置名字。
不設置名字
設置一個名字
設置多個名字
- 注意?。?! 當你設置名字后,默認命名就失效了!!再用默認命名就會拋出異常
![]()
二、獲取 Bean 對象
獲取 bean 對象也叫做對象裝配,是把對象取出來放到某個類中,有時候也叫對象注入。(是放到類里??! )
對象裝配(對象注入)的實現方法有以下 3 種
- 屬性注入
- Setter注入
- 構造方法注入
@Autowired
這三種方式都可以由注解@Autowired實現的,只是實現方式不同 。
下面就用IoC容器模擬實現一對一家教的老師分配學生的場景來講解三種注入方法。
所需要用到的類,Student(代表一個學生),Students(學生表),Teacher(表示一個教師),App(啟動類/測試類)Student類
Students類,通過方法注解@Bean將Student對象添加到IoC容器中。
Teacher類,在里面通過給student變量注入對象來演示三種對象注入的方式。
屬性注入
使用示例:
Teacher類中的Student類型的student變量,就通過屬性注入的方法,在IoC容器中注入了對象 。
屬性注入的工作原理就是通過你變量的類型,去IoC容器中找尋匹配的類型然后注入到對應的變量中!
BUG
假如IoC容器中有兩個相同變量的類型,此時就會有BUG。
修改Students代碼,讓他向IoC容器中添加兩個相同類型的對象。
解決方案1??:使變量名與@Bean的名字相同。
解決方案2??:@Autowired配合@Qualifier一起使用
屬性注入的優(yōu)缺點:
優(yōu)點 :
使用簡單。
缺點 :
1??:無法注入final修飾的變量。2??:通用性問題,只適用于IoC容器。
修改代碼,Teacher類不在IoC容器中
此時就不會再進行屬性注入了!3??:更容易違背單一設計原則
Setter注入
使用示例:
setter注入的工作原理就是通過你方法參數的類型,去IoC容器中找尋匹配的類型然后注入到參數中!
工作原理與屬性注入相同,所以BUG也相同,解決方案也相同。
BUG
假如IoC容器中有兩個相同變量的類型,此時就會有BUG。
修改Students代碼,讓他向IoC容器中添加兩個相同類型的對象。
解決方案1??:使參數列表的變量名與@Bean的名字相同。
解決方案2??:@Autowired配合@Qualifier一起使用
setter注入的優(yōu)缺點:
優(yōu)點 :
通常Setter只Set一個屬性,所以Setter注入更符合單一設計的原則。
缺點 :
1??:無法注入final修飾的變量。
2??:setter注入的對象可以被改變,因為setter是一個方法,可能會被調用多次,因此注入的對象就被改變了。
構造方法注入
使用示例:
構造方法注入的工作原理就是通過構造方法方法參數的類型,去IoC容器中找尋匹配的類型然后注入到參數中!
工作原理與屬性注入相同,所以BUG也相同,解決方案也一半相同。
BUG
假如IoC容器中有兩個相同變量的類型,此時就會有BUG。
修改Students代碼,讓他向IoC容器中添加兩個相同類型的對象。
解決方案:使參數列表的變量名與@Bean的名字相同。
構造方法注入的優(yōu)缺點:
優(yōu)點 :
1??可以注入final修飾的變量
2??:注入的對象不會被修改,因為構造方法只加載一次。
3??:構造方法注入可以保證注入對象完全初始化。
4??:構造方法注入通用性更好。
缺點 :
1??:寫法比屬性注入復雜。
2??:使用構造方法注入,無法解決循環(huán)依賴的問題。
@Resource
@Resource與@Autowired的使用方式方法一模一樣,但是這兩個注解也是有區(qū)別的。
@Resource與@Autowired的區(qū)別
1?? 出身不同 :@Resource來自于JDK,@Autowired來自于Spring框架。
2?? 支持參數不同 :@Resource支持很多參數設置,@Autowired只支持一個參數設置。(下篇文章介紹)
3?? 使用上的區(qū)別 :@Resource不支持構造方法注入,@Autowired支持構造方法注入。
4?? IDEA兼容性不同 :@Autowired在專業(yè)版IDEA中可能會誤報,@Resource不會。
總結
以上就是今天要講的內容,本文介紹了使用注解更快捷便利的存儲獲取Bean對象!文章來源:http://www.zghlxwxcb.cn/news/detail-618790.html
路漫漫不止修身,也養(yǎng)性。文章來源地址http://www.zghlxwxcb.cn/news/detail-618790.html
到了這里,關于Spring——更快捷的存儲 / 獲取Bean對象的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!