導航:首頁 > 文件管理 > ioc註解和配置文件

ioc註解和配置文件

發布時間:2023-06-15 01:13:32

1. SpringBoot自動配置的原理及實現/SpringBoot之@Import註解正確使用方式

https://www.jianshu.com/p/6b2f672e2446
了解SpringBoot之@Import註解正確使用方式

SpringBoot 的核心就是自動配置,自動配置又是基於條件判斷來配置 Bean。關於自動配置的源碼在 spring-boot -autoconfigure-2.0.3.RELEASE.jar

在通常需要我們在 property 中配置信息時,通常使用 @ConfigurationProperties(pefix=「前綴」) 註解的方式從配置文件中獲取配置,如下:

application.yml 中配置信息

訪問 url 獲取配置信息返回的值
http://localhost:8080/msg

如果把 application.yml 中的配置信息注釋掉則默認使用 default 值,否則使用配置信息中的值,以上便是普通配置方式

SpringBoot 運行原理
先看 @SpringBootApplication

主要關注的幾個註解如下
@SpringBootConfiguration:標記當前類為配置類
@EnableAutoConfiguration:開啟自動配置
@ComponentScan:掃描主類所在的同級包以及下級包里的 Bean
關鍵是 @EnableAutoConfiguration

最關鍵的要屬 @Import(.class),藉助** **,@EnableAutoConfiguration 可以幫助 SpringBoot 應用將所有符合條件的 @Configuration 配置都載入到當前 SpringBoot 創建並使用的 IoC 容器: 通過 @Import(.class) 導入的配置功能,
中的方法 getCandidateConfigurations,得到待配置的 class 的類名集合, 這個集合就是所有需要進行自動配置的類,而是是否配置的關鍵在於 META-INF/spring.factories 文件中是否存在該配置信息

打開,如下圖可以看到所有需要配置的類全路徑都在文件中,每行一個配置,多個類名逗號分隔, 而 \ 表示忽略換行

整個流程如上圖所示

以 類來看其主要構成部分

都能看到各種各樣的條件判斷註解,滿足條件時就載入這個 Bean 並實例化
此類的條件註解是:@ConditionalOnProperty

@ConditionalOnBean:當容器里有指定 Bean 的條件下
@ConditionalOnClass:當類路徑下有指定的類的條件下
@ConditionalOnExpression:基於 SpEL 表達式為 true 的時候作為判斷條件才去實例化
@ConditionalOnjava:基於 JVM 版本作為判斷條件
@ConditionalOnJndi:在 JNDI 存在的條件下查找指定的位置
@ConditionalOnMissingBean:當容器里沒有指定 Bean 的情況下
@ConditionalOnMissingClass:當容器里沒有指定類的情況下
@ConditionalOnWebApplication:當前項目時 Web 項目的條件下
@:當前項目不是 Web 項目的條件下
@ConditionalOnProperty:指定的屬性是否有指定的值
@ConditionalOnResource:類路徑是否有指定的值
@:當指定 Bean 在容器中只有一個,或者有多個但是指定首選的 Bean
這些註解都組合了 @Conditional 註解,只是使用了不同的條件組合最後為 true 時才會去實例化需要實例化的類,否則忽略
這種 spring4.X 帶來的動態組合很容易後期配置,從而避免了硬編碼,使配置信息更加靈活多變,同時也避免了不必要的意外異常報錯。使用的人只要知道配置的條件即可也不用去閱讀源碼,方便快捷,這也是 sprignboot 快捷方式帶來的好處

參考 HttpEncodingAutoConfiguration 配置信息如下

案例擴展

項目

需要實例化的服務類

配置信息對應的屬性映射類, 需要 pom 中加入 spring-boot-starter 依賴

自動配置文件

在創建如下路徑文件 src/main/resources/META-INF/spring.factories

必須是自動配置類的全路徑

mvn install 該項目

創建一個 springboot-mvc 項目 pom 依賴上面的 jar

http://localhost:8080 / 則返回當前服務的默認值

在 applicaton.yml 中加, 重啟刷新則會更新為如下信息

SpringBoot 自動化配置關鍵組件關系圖
mybatis-spring-boot-starter、spring-boot-starter-web 等組件的 META-INF 文件下均含有 spring.factories 文件,自動配置模塊中,SpringFactoriesLoader 收集到文件中的類全名並返回一個類全名的數組,返回的類全名通過反射被實例化,就形成了具體的工廠實例,工廠實例來生成組件具體需要的 bean。

在 spring boot 中有時候需要控制配置類是否生效, 可以使用 @ConditionalOnProperty 註解來控制 @Configuration 是否生效.

2. SpringBoot自動裝配原理

初看@SpringBootApplication有很多的註解組成,其實歸納就是一個"三體"結構,重要的只有三個Annotation:

(1)@Configuration註解

(2)@ComponentScan

(3)@EnableAutoConfiguration

從源碼中可以知道,最關鍵的要屬@Import(.class),藉助,@EnableAutoConfiguration可以幫助SpringBoot應用將所有符合條件的@Configuration配置都載入到當前SpringBoot創建並使用的IoC容器。同時藉助於Spring框架原有的一個工具類:SpringFactoriesLoader,@EnableAutoConfiguration就可以實現智能的自動配置。

總結 :@EnableAutoConfiguration作用就是從classpath中搜尋所有的META-INF/spring.factories配置文件,並將其中org.springframework.boot.autoconfigure.EnableutoConfiguration對應的配置項通過反射(Java Refletion)實例化為對應的標注了@Configuration的JavaConfig形式的IoC容器配置類,然後匯總為一個並載入到IoC容器。這些功能配置類要生效的話,會去classpath中找是否有該類的依賴類(也就是pom.xml必須有對應功能的jar包才行)並且配置類裡面注入了默認屬性值類,功能類可以引用並賦默認值。生成功能類的原則是自定義優先,沒有自定義時才會使用自動裝配類。

1、從spring-boot-autoconfigure.jar/META-INF/spring.factories中獲取redis的相關配置類全限定名(有120多個的配置類)RedisAutoConfiguration,一般一個功能配置類圍繞該功能,負責管理創建多個相關的功能類,比如RedisAutoConfiguration負責:JedisConnectionFactory、RedisTemplate、StringRedisTemplate這3個功能類的創建

2、RedisAutoConfiguration配置類生效的一個條件是在classpath路徑下有RedisOperations類存在,因此springboot的自動裝配機制會會去classpath下去查找對應的class文件。

3.如果pom.xml有對應的jar包,就能匹配到對應依賴class,

4、匹配成功,這個功能配置類才會生效,同時會注入默認的屬性配置類@EnableConfigurationProperties(RedisProperties.class)

5.Redis功能配置裡面會根據條件生成最終的JedisConnectionFactory、RedisTemplate,並提供了默認的配置形式@ConditionalOnMissingBean(name = "redisTemplate")

6.最終創建好的默認裝配類,會通過功能配置類裡面的 @Bean註解,注入到IOC當中
7.用戶使用,當用戶在配置文件中自定義時候就會覆蓋默認的配置@ConditionalOnMissingBean(name = "redisTemplate")

1.通過各種註解實現了類與類之間的依賴關系,容器在啟動的時候Application.run,會調用.class的selectImports方法(其實是其父類的方法)-- 這里需要注意,調用這個方法之前發生了什麼和是在哪裡調用這個方法需要進一步的探討

2.selectImports方法最終會調用SpringFactoriesLoader.loadFactoryNames方法來獲取一個全面的常用BeanConfiguration列表

3.loadFactoryNames方法會讀取FACTORIES_RESOURCE_LOCATION(也就是spring-boot-autoconfigure.jar 下面的spring.factories),獲取到所有的Spring相關的Bean的全限定名ClassName,大概120多個

4.selectImports方法繼續調用filter(configurations, autoConfigurationMetadata);這個時候會根據這些BeanConfiguration裡面的條件,來一一篩選,最關鍵的是
@ConditionalOnClass,這個條件註解會去classpath下查找,jar包裡面是否有這個條件依賴類,所以必須有了相應的jar包,才有這些依賴類,才會生成IOC環境需要的一些默認配置Bean

5.最後把符合條件的BeanConfiguration注入默認的EnableConfigurationPropertie類裡面的屬性值,並且注入到IOC環境當中

3. 請你談談對spring的理解

1.解釋spring的ioc? 幾種注入依賴的方式?spring的優點?

IOC你就認為他是一個生產和管理bean的容器就行了,原來需要在調用類中new的東西,現在都是有這個IOC容器進行產生,同

時,要是產生的是單例的bean,他還可以給管理bean的生命周期!

spring的IOC有三種注入方式 :

第一是根據屬性注入 也叫set方法注入;
第二種是根據構造方法進行注入;

第三種是根據註解進行注入,這種方式我認為比較好,方便,要是bean多的話,使用前兩種方式會使得配置文件過於臃腫。

Spring的優點:主要是根據它的IOC和AOP體現的。我感覺他就是把我們以前用到的工廠模式和代理模式進行了一個封裝。
IOC主要是解決了代碼的耦合性問題,而AOP是面向切面編程的最好解釋!

2.解釋Spring中IOC, DI, AOP
ioc就是控制翻轉或是依賴注入。通俗的講就是如果在什麼地方需要一個對象,你自己不用去通過new 生成你需要的對象,

而是通過spring的bean工廠為你長生這樣一個對象。

aop就是面向切面的編程。比如說你每做一次對資料庫操作,都要生成一句日誌。如果,你對資料庫的操作有很多類,
那你每一類中都要寫關於日誌的方法。但是如果你用aop,那麼你可以寫一個方法,在這個方法中有關於資料庫操作的方法,
每一次調用這個方法的時候,就加上生成日誌的操作。

3.spring的ioc/aop/代理
ioc是控制反轉,是spring的核心思想。通過面向介面編程來實現對業務組件的動態依賴。 aop是面向

切面編程,它並不是只在spring或者java中才有的,它和面向對象編程(oop)是相對而言的另一種編程思想。

spring在實現aop編程時利用的是java的代理機制。 個人覺得java代理機制真的是很神奇。核心內容並不多

4.spring的ioc是解耦,aop是干什麼的
AOP面向切面編程 將程序中的交叉業務邏輯(比如安全,日誌,事務等),封裝成一個切面,然後注入到目標對象(具體業務邏輯)中去。
比如: 很多方法可能會拋異常,你要記錄這個異常到日誌中去,可以寫個攔截器類,在這個類中記錄日誌,
在spring.xml中配置一個對這些要記錄日誌的方法的aop攔截器 在這個方法執行後調用這個攔截器,記錄日誌。
這樣就不用每次拋異常都要手動記錄日誌。 spring的事務管理用到的就是aop 這樣也可以提高程序的內聚性。

5.講解一下Java中Spring中IOC和AOP
IoC:說直白點,就是通過配置文件(XML或.properties)指定需要實例化的JAVA類(類名的完整字元串),
包括該JAVA類的一組初始化值,然後我們在代碼中載入該配置文件,然後通過 .getBean() 函數就可以得到一個該JAVA類的對象,
並且該對象已經根據配置文件中指定的屬性值進行了初始化。

AOP:這個比IoC更簡單,直白點說就是實現調用某個方法之前或/和之後,自動執行一系列自定義的語句

6.簡述Spring框架中IOC和AOP
IOC:控制反轉,是一種設計模式。一層含義是控制權的轉移:由傳統的在程序中控制依賴轉移到由容器來控制;
第二層是依賴注入:將相互依賴的對象分離,在spring配置文件中描述他們的依賴關系。他們的依賴關系只在使用的時候才建立。

AOP:面向切面,是一種編程思想,OOP的延續。將系統中非核心的業務提取出來,進行單獨處理。比如事務、日誌和安全等。
Spring 的AOP和IOC都是為了解決系統代碼耦合度過高的問題。使代碼重用度高、易於維護。
不過AOP和IOC並不是spring中特有的,只是spring把他們應用的更靈活方便 。

4. springboot三大核心註解是什麼

springboot三大核心註解是@Configuration,@EnableAutoConfiguration和@ComponentScan。提到@Configuration就要提到他的搭檔@Bean,使用這兩個註解就可以創建一個簡單的spring配置類,可以用來替代相應的xml配置文件。

springboot三大核心註解的特點

這個註解類標識這個類可以使用SpringIoC容器作為bean定義的來源,@Bean註解告訴Spring,一個帶有@Bean的註解方法將返回一個對象,該對象應該被注冊為在Spring應用程序上下文中的bean。

能夠自動配置spring的上下文,試圖猜測和配置你想要的bean類,通常會自動根據你的類路徑和你的bean定義自動配置,會自動掃描指定包下的全部標有@Component的類,並注冊成bean,當然包括@Component下的子註解@Service,@Repository和@Controller。

5. 有哪些比較好的AndroidSQLite開源工具類(android中的sqlite資料庫具有哪些特點)

是一個免費的開源的、簡易的、遵循Apache2開源協議發布的Android開發框架,其開發宗旨是簡單、快速的進行Android應用程序的開發,包含Androidmvc、簡易sqliteorm、ioc模塊、封裝Androidhttpclitent的http模塊,具有快速構建文件緩存功能,無需考慮緩存文件的格式,都可以非常輕松的實現緩存,它還基於文件緩存模塊實現了圖片緩存功能,在android中載入的圖片的時候,對oom的問題,和對載入圖片錯位的問題都輕易解決。他還包括了一個手機開發中經常應用的實用工具類,如日誌管理,配置文件管理,android下載器模塊,網路切換檢測等等工具。

目前主要有以下模塊:

MVC模塊:實現視圖與模型的分離。

ioc模塊:android中的ioc模塊,完全註解方式就可以進行UI綁定、res中的資源的讀取、以及對象的初始化。

資料庫模塊:android中的orm框架,使用了線程池對sqlite進行操作。

http模塊:通過httpclient進行封裝http數據請求,支持非同步及同步方式載入。

緩存模塊:通過簡單的配置及設計可以很好的實現緩存,對緩存可以隨意的配置

圖片緩存模塊:imageview載入圖片的時候無需考慮圖片載入過程中出現的oom和android容器快速滑動時候出現的圖片錯位等現象。

配迅擾頌置器模塊:可以對簡易的實現配對配置的操作,目前配置文件可以支持Preference、Properties對配置進行存取。

日誌列印模塊:可以較快的輕易的是實現日誌列印,支持日誌列印的擴展,目前支持對sdcard寫入本地列印、以及控制台列印

下載器模塊:可以簡單的實現多線程下載、後台下載、斷點續傳、對下載進李肆行控制、如開始、暫停、刪除等畝鄭等。

網路狀態檢測模塊:當網路狀態改變時,對網路狀態進行檢測。

閱讀全文

與ioc註解和配置文件相關的資料

熱點內容
聖墟在哪個App看免費 瀏覽:395
網路哪些不能玩 瀏覽:868
probe315使用教程 瀏覽:646
數字電位器程序 瀏覽:198
c代碼整理 瀏覽:104
網路營銷具有什麼優勢 瀏覽:378
右下角網路連接不顯示寬頻連接 瀏覽:940
ps修改tif文件 瀏覽:580
預防醫學如何轉行做大數據 瀏覽:234
pdf文件變藍 瀏覽:309
怎麼在pdf文件上面用k寶簽名 瀏覽:213
如何知道表格里數據後面有空格 瀏覽:720
gee引擎更新系統找不到指定文件 瀏覽:802
貝殼網的數據刪除了如何找回 瀏覽:509
華為榮耀6x怎麼切換網路 瀏覽:418
手機里的pdf文件在哪放 瀏覽:889
java版貪吃蛇畢業論文 瀏覽:989
微信公共號郵箱 瀏覽:415
圖片寬度代碼 瀏覽:460
有哪些好用的相見恨晚的app 瀏覽:664

友情鏈接