🛫更多知識總結見SpringBoot 2專欄
?🚕本篇知識點總結自尚硅谷雷神的視頻
🚒博主對于該知識尚在學習階段
🚄如果發現存在問題請毫不吝嗇的指出
🚀🚀扎哇太棗糕的博客首頁🚀🚀
目錄
向容器注冊組件@Bean
注冊組件的@Component
條件裝配@Conditional
導入配置文件@ImportResource
添加指定類的組件到容器@Import
配置綁定@ConfigrationProperties
向容器注冊組件@Bean
????????在Spring中向容器中注冊一個Bean使用的是applicationContext.xml配置文件中的bean標簽,但是SpringBoot中使用的是MyConfig配置類中方法加@Bean注解。這兩種方式得到的結果是一樣的,只不過是兩種不同的編碼風格而已。
????????單純的寫代碼還不行,要想辦法讓容器知道你想要注冊Bean,Spring使用的方法是在web.xml中聲明applicationContext.xml配置文件使其中的配置生效,SpringBoot使用的是@Configuration注解向容器中注冊,因為配置類其本身而言也是一個組件。
🚩配置類中使用的注解
@Configuration:向SpringBoot聲明這是一個配置類,相當于web.xml里的配置文件聲明
@Bean:向容器注冊注解下面方法返回值對應的對象,相當于bean標簽。@Bean注解還可以使用參數給對象命名,相當于bean標簽中的id屬性。默認命名為注解下面的方法名🚩獲取指定的組件
? ? ? ? run.getBean()方法
🚩容器中對象創建模式
? ? ? ? 默認為單例模式,也就是在容器中創建好所有的對象,當外部需要獲取對象的時候跳過創建步驟直接去容器中拿即可,所以說無論外部調用多少次組件注冊方法獲取的都是同一個對象。????????當然還可以修改屬性proxyBeanMethods(Bean方法代理模式)的值進行單例多例的切換,屬性值的改變導致SpringBoot底層擁有兩種配置模式:
- Full(全配置):proxyBeanMethods為true,單例,判斷容器中有沒有該對象,有則直接取無則創建
- Lite(輕量配置):proxyBeanMethods為false,多例,對象直接創建。相較于全配置的先判斷再創建或者獲取,Lite直接創建節省了時間,所以被稱為是輕量級配置。
????????如果存在組件依賴的問題的話,必須采用全配置。所謂的組件依賴就是說在容器中一個組件中的屬性是另一個組件或者說使用到了另一個組件,此時就稱這個組件依賴于另一個組件。如果采用輕量配置的話,這個組件中的屬性將不是另一個組件對象,雖然對象名稱都一樣但是地址不同。
注冊組件的@Component
@Component:每一層都通用的注解,用于注冊組件到容器中,相當于bean標簽。缺點就是辨識度不高,無法通過注解理清楚這是哪一層的業務
@Controller:controller層的作用相當于@Component注解
@Service:service層實現類的作用相當于@Component注解
@Repository:mapper層實現類的作用相當于@Component注解
條件裝配@Conditional
@Conditional:滿足條件就向容器中注冊組件
案例一@ConditionalOnBean:容器中的組件之間存在組件依賴,當被依賴的組件不存在的時候,不向容器中添加另一個組件
?? 如果將這個注解放在類上的話, 即是滿足條件時類中的所有方法才能生效,否則都不生效。
????并且在類中的組件注冊也是順序的,使用條件裝配注解時會因為注冊寫在后面就被判斷為不滿足條件
案例二@ConditionalOnMissingBean:沒有組件時進行裝配
導入配置文件@ImportResource
@ImportResource
添加指定類的組件到容器@Import
@Import:調用類中的無參構造器創建一個對象作為組件添加到容器中,組件的默認名為類的全限名
配置綁定@ConfigrationProperties
@ConfigrationProperties:將實體類與配置文件的配置項相綁定,直接給實體類中的屬性注入數據。prefix屬性是指定配置文件里引用屬性的前綴,且@ConfigrationProperties必須配合@Component注解使用才能讓容器知道有這么一個綁定規則
?如果@ConfigrationProperties不配合@Component注解使用的話,還可以在配置類上使用@EnableConfigurationProperties讓容器知道有這么一個綁定規則,屬性為實體類的class文件
?