目錄
一. Spring是什么
IoC
DI
二. IoC&DI的使用
IoC
1.@Controller(控制器存儲)
2.@Service(服務存儲)
3.@Repository(倉庫存儲)
4.@Componemt(組件存儲)
5.@Configuration(配置存儲)
多種類注解的作用
6.@Bean(方法注解)
指定路徑注解---@ComponentScan
bean的命名
1.五大注解存儲的bean
2.@Bean注解儲存
DI
1.屬性注入
2.構造方法注入
3.Set方法注入
三種注入方式的優缺點
@Autowired存在問題的解決方式
一. Spring是什么
Spring是一個包含眾多工具的IoC容器
容器:Tomcat--->web容器
? ? ? ? ? ? List/Map--->數據存儲容器
Spring容器裝的是對象。
IoC:控制反轉
控制權反轉,創建對象的控制權。
IoC
IoC的本質是為了解耦合。
舉個例子:
建筑汽車時,汽車依賴車身,車身依賴底盤,底盤依賴輪胎。
car--->framework--->bottom--->tire
普通方式:
當想要遭不同輪胎尺寸的車輛時,修改輪胎類,把size設置為輪胎屬性。于此同時要修改所有關聯的類。
這種方式改動一個屬性,需要需改所有關聯的代碼。
想要修改輪胎屬性,而不影響其他的關聯類,這個時候使用IoC的方式。
spring提供的IoC的思想:
每個類之間界限清晰,添加一個屬性時其他的類關聯性弱,而Spring IoC需要做的就是管理對象,即實現下面Main方法的作用。
Spring幫助我們管理對象,我們需要做的事情:
1.告訴Spring,幫我們管理哪些對象
2.知道如何取出來這些對象
DI
IoC是一種思想,DI是一種實現方式。(注入依賴)
注入依賴,比如:上面的Car類中,把Framework注入Car中。
二. IoC&DI的使用
@Autowired:(英文:自動裝配),用來注入依賴
@Componemt:(英文意為組件,即對象),用來存取對象
以之前的圖書管理系統為例:
IoC
1.類注解:@Controller、?@Service、@Repository、@Componemt、@Configuration
2.方法注解:@Bean
1.@Controller(控制器存儲)
用@Controller存儲bean的代碼
2.@Service(服務存儲)
用@Service儲bean的代碼
getBean()提供的三種獲取bean的方式
@SpringBootApplication
public class IoCDemoApplication {public static void main(String[] args) {//Spring上下文,返回Spring的運行環境ApplicationContext context=SpringApplication.run(IoCDemoApplication.class, args);//從context中獲取beanUserController bean = context.getBean(UserController.class);bean.doController();UserService userService = context.getBean(UserService.class);userService.doService();//按照名稱來獲取beanUserService userService2 = (UserService)context.getBean("userService");userService2.doService();//根據名稱和類型獲取beanUserService userService3 = context.getBean("userService", UserService.class);userService3.doService();}}
bean的命名約定:小寫字母開頭,采用駝峰命名。
特殊情況:如果類名的前兩位都是大寫,bean的名稱不變
eg: UController------> "UController"
3.@Repository(倉庫存儲)
4.@Componemt(組件存儲)
5.@Configuration(配置存儲)
多種類注解的作用
這些類注解的用法相似,有這么多的類注解的目的是為了更好的應用分層,根據不同的類注解能直接了解當前類的用途。
@Controller(控制層)、?@Service(業務邏輯層)、@Repository(數據訪問層)、@Configuration(配置層)
注解之間的關系
@Controller、?@Service、@Repository都是@Componemt的衍生類,即@Componemt是他們的父類
若想讓外界訪問到,程序的入口只能使用@Controller
6.@Bean(方法注解)
1.上述五大注解只能加在類上,并且只能加在自己的代碼上,當想要引入一個第三方jar包,也希望交給Spring管理
2.當對于一個類想要定義多個對象時,無法用上述五大注解完成。
這兩種情況需可以使用@Bean方法注解
使用
1.@Bean必須搭配五大注解使用
2.使用@Bean注解時,一個類型存在多個bean時,不能使用類型獲取對象,使用bean的名稱獲取對象,bean的名稱是方法名
@Bean傳遞參數
如果需要的Bean的類型對應的對象只有一個時,就直接賦值。如果有多個時通過名稱來匹配。
指定路徑注解---@ComponentScan
SpringBoot的特點:約定大于配置
springBoot默認掃描路徑是啟動類所在的目錄及子孫目錄
比如:啟動類的代碼、位置大于我們自己的代碼
啟動類在哪里就只掃描哪個路徑下的文件內容
使用@ComponentScan指定路徑
bean的命名
1.五大注解存儲的bean
1.前兩位名稱全為大寫,bean名稱為類名
2.其他的為類名首字母小寫
3.通過value設置屬性,@Controller(value=xxx")
2.@Bean注解儲存
1.bean名稱為方法名
2.通過name屬性設置@Bean(name="aaa?","bbb")
DI
對依賴對象的注入,也被叫做“屬性裝配”、“依賴裝配”。
1.屬性注入
使用@Autowired
2.構造方法注入
存在無參的構造函數和有參的構造函數時,不加注釋會默認使用無參的構造函數
如果存在多個構造函數時,需要加上@Autowired注明使用哪個構造函數
如果只有一個構造函數,@Autowired可以省略掉
3.Set方法注入
三種注入方式的優缺點
1.屬性注入
優點:簡潔、使用方便
缺點:只能使用IoC容器、不能注入final修飾的屬性
2.構造函數注入
優點:可注入final修飾的屬性、注入的對象不會被修改;依賴對象在使用前一定會被初始化,因為依賴是在類的構造方法中執行的,而構造方法是在類加載階段就會執行;通用性好,構造方法是JDK支持的,所以更換任何框架都是試用的。
缺點:注入多個對象時,代碼會比較繁瑣。
3.Set方法注入
優點:方便實例后,重新對對象進行配置或注入。
缺點:注入對象可能會被改變,因為Setter方法可能會被多次調用,就有被修改的風險;不能注入一個final修飾的屬性。
@Autowired存在問題的解決方式
當程序中一個類型有多個對象時,使用@Autowired會報錯
解決方式:
1.屬性名和需要使用的對象名保持一致
2.使用@Primary注解標識默認的對象
3.使用@Qualifier
指定要使用的屬性
4.使用@Resource注解
使用@Autowired和使用@Resource的區別
1.@Autowired是Spring框架提供的,@Resource是JDK提供的
2.@Autowired默認按照類型注入,如果一個類型存在多個對象,按名稱匹配不上,就會報錯。而@Resource按照名稱注入,相比之下@Resource支持更多的參數設置