?回顧
企業命名規范
大駝峰:BookDao(首字母都大寫) | 類名 |
小駝峰:bookDao(第一個字母小寫) | 方法名 |
蛇形:book_dao(小寫+下劃線_) | 數據庫 |
串形:book-dao(小寫+連字符-) | 項目文件夾 |
各種注解
學習Spring MVC, 其實就是學習各種Web開發需要?的到注解
a. @RequestMapping: 路由映射
b. @RequestParam: 后端參數重命名
c. @RequestBody: 接收JSON類型的參數
d. @PathVariable: 接收路徑參數
e. @RequestPart: 上傳?件
f. @ResponseBody: 返回數據
g. @CookieValue: 從Cookie中獲取值
h. @SessionAttribute: 從Session中獲取值
i. @RequestHeader: 從Header中獲取值
?j. @Controller: 定義?個控制器, Spring 框架啟動時加載, 把這個對象交給Spring管理. 默認返回 視圖.
k. @RestController: @ResponseBody + @Controller 返回數據
好用的工具插件
Java EE學習階段會涉及較多?具, 插件的學習, 來幫助我們提?開發效率. ?如Postman, lombok, EditStarter, 后?還會繼續學習其他的?具或插件.?
一.Spring
Spring兩大核心思想
1.IoC
2.AOP
1.IoC控制反轉
Inversion of Control 控制反轉,Spring是一個控制反轉的容器.(spring擁有了創建對象的控制權)
舉一個例子來理解什么是控制反轉?
我們要造一輛汽車,汽車依賴車身,車身依賴底盤,底盤依賴輪子.
由于層層的依賴關系,程序的耦合度非常高,此時如果我們想改變位于底層的輪胎的大小,或者增加輪胎的屬性,整個調用鏈上的所有代碼都需要修改.這當然是是一個問題.
如果我們轉變思路:先根據汽車的樣子設計車身,再根據車身設計底盤,根據底盤設計輪子. 這個時候,他們的依賴關系就完全倒置了: 輪子依賴底盤,底盤依賴車身,車身依賴汽車.
實現:將所需要的依賴從原來創建下級類的方式改為傳遞/注入的方式,此時我們不需要關注下級類的屬性變化,傳遞過來的是什么,我們就接受什么,此類本身并不需要修改代碼.這也完成了程序的解耦!
IoC方式和傳統方式的對比
傳統開發對象的創建順序: Car? -? FrameWork -? Bottom? -? Tire
改進之后的創建對象順序:Tire? -? Bottom? -? Framework? -? Car
改進之后的控制權發生了反轉,不再是使用方對象創建并控制依賴對象了,而是把依賴對象注入到當前對象中,依賴對象的控制權不再由當前類控制.
這也就是IoC的實現思想.
IoC容器的優點
資源不再由使用雙方管理,而是由第三方管理
1.資源集中管理:IoC容器會幫我們管理一些資源對象,需要時,去容器中去取就可以了
2.解耦合:降低了使用資源雙方的依賴程度,創建實例的時候不需要了解其中的細節
總結:Spring是一個包含眾多工具的IoC容器,來幫助我們做資源管理.
IoC是一種思想,DI是IoC的一種實現方法.
2.DI依賴注入
Dependency Injection依賴注入
容器在運行期間,動態地為應用程序提供運行時所依賴的資源.
上述代碼中就是通過構造函數的方式,把依賴對象注入到使用的對象中.
二.IoC 和 DI 的使用
Spring作為一個IoC容器,它具備兩個最基礎的功能,那就是存和取;
存和取的其實就是spring容器幫管我們管理的對象,我們把他們稱之為Bean.
這些對象交由Spring管理,由Spring來負責對象的創建和銷毀.
我們要做的分兩步:
1.告訴Spring,哪些需要存 | 添加@Component注解(例) |
2.知道如何從Spring取出對象 | 添加注解@Autowired |
比如:
原本在UserController類中要使用UserDao對象,就需要new出UserDao對象,但是現在我們也可以將UserDao交給Spring管理了, 具體的實現只需要兩步 :?
1.告訴Spring幫我們管理UserDao?
在類上面添加@Component注解
2.從Spring中獲取UserDao對象
在對象聲明時添加@Autowired注解
Bean的存儲
上述IoC容器創建和管理對象的過程也就是bean的存儲.
前面我們使用的是@Component注解來把對象交給IoC容器管理,而Spring框架為了更好服務web應用程序,提供了更更富的注解.
1.類注解(五大注解)
@Controller | 控制層存儲 |
@Service | 服務存儲 |
@Repository | 倉庫存儲 |
@Component | 組件存儲 |
@Configuration | 配置存儲 |
1.1@Controller
使用@Controller存儲bean:
?
從Spring上下文中獲取bean對象的三種方式:
先獲取到Spring上下文,再調用getBean方法.
- getBean(Class)
- getBean(String s)
這種要強轉 .
特殊情形:如果類名前兩位都是大寫,那么不用變,直接使用原名
- getBean(String , Class)
bean名的約定
類名: UserController, Bean的名稱為: userController
類名: AccountManager, Bean的名稱為: accountManager
類名: AccountService, Bean的名稱為: accountService
特殊情況, 當有多個字符并且第?個和第?個字符都是?寫時, 將保留原始的??寫.
?如
類名: UController, Bean的名稱為: UController
類名: AManager, Bean的名稱為: AManager
1.2@Service
1.3@Repository
1.4@Component
1.5@Configuration
上述四個注解和@Controller也是相同的使用方法.
為什么要這么多注解
其實注解和分層式呼應的.不同的注解對應不同的用途.
- @Controller:控制層, 接收請求, 對請求進?處理, 并進?響應.
- ?@Servie:業務邏輯層, 處理具體的業務邏輯.
- @Repository:數據訪問層,也稱為持久層. 負責數據訪問操作
- ?@Configuration:配置層. 處理項?中的?些配置信息
注解之間的關系
- @Controller / @Service / @Repository / @Configuration 這四個注解的源碼里都有一個@Component , 說明它們本身就是屬于@Component的 " 子類 " ,@Component 是?個元注解,@Controller , @Service , @Repository 等. 這些注解被稱為 @Component 的衍?注解.
- @Controller , @Service 和 @Repository ?于更具體的?例(分別在控制層, 業務邏輯層, 持 久化層), 在開發過程中, 如果你要在業務邏輯層使? @Component 或@Service,顯然@Service是更 好的選擇.
- 只有@controller注解才可以被其他類訪問到,這是controller的特殊功能.
ApplicationContext? 和 BeanFactory
BeanFactory
獲取bean對象其實是父類BeanFactory提供的功能.
- 它們都是Spring容器的的頂級接口,其實BeanFactory提供了基礎的訪問容器的能力,ApplicationContext屬于BeanFactory的子類,繼承了BeanFactory的所有功能,并且還擁有獨立的特性,添加了國際化支持/資源訪問支持/時間傳播
- 性能:applicationContext是一次性加載并初始化所有Bean對象,而BeanFactory是懶加載,需要用到才會去加載,因此更輕量.
2.方法注解@bean
五大注解只能加載類上,并且只能加在自己的代碼上
若想獲取一個類的多個bean時,不能使用類型來獲取對象. 否則會取到同一個對象.
2.1獲取第三方類
由于五大注解只能加在自己寫的類上,對于一些第三方的包,我們只能通過方法注解來獲取第三方類
假如這是一個第三方類:
- 方法注解必須搭配五大注解使用!
- 一個類包含多個bean,只能使用bean名稱獲取
2.2bean傳參
Bean會根據名稱匹配. 但是如果對應類型的對象只有一個時,就不會看名稱,而是直接賦值 .
(比如只有一個String類型的bean,此時參數就是一個String類型,那么就會直接用這個唯一的String類型的bean,而不會看名稱匹配)
springBoot特點有一個特點是約定大于配置
體現:掃描路徑
默認的掃描路徑是啟動類所在目錄以及子目錄.
另外,@ComponentScan("") 可以指定掃描路徑.
如果沒有指定,使用默認的掃描路徑.
三.DI詳解
依賴注入/屬性裝配
1.屬性注入@Autowired
屬性注入以類型進行匹配,與注入的屬性名稱無關
注意:無法注入final修飾的屬性.
@Autowired的問題:如果一個類型存在多個對象,優先名稱匹配,如果名稱都匹配不上,那就會報錯.
解決方式:
1.屬性名和需要使用的對象名保持一致.(使用名稱匹配)
2.使用@Primary注解表示默認的bean
3.使用@Qualifier來指定bean
4.使用@Resource來指定bean
@Autowired和@Resouce的區別
- @Autowired是spring框架的注解,而@Resource是JDK提供的注解.
- @Autowried是默認是按照類型注入,如果類型一樣,優先按照名稱匹配,而@Resource是按照名稱注入,它可以設置name屬性來獲取bean
2.構造方法注入
如果只有一個構造函數,@Autowired可以省略
如果存在多個構造方法,需要加@Autowired注明使用哪個構造方法