組件提供者如何編寫出僅需系統開發者進行包引入就可以對spring進行bean注入等操作?
其實在spring庫中有提供自動化配置的庫spring-boot-autoconfigure,我們只需要引入這個庫包就可以對已引入的AOP、JDBC、TX事務管理器等進行自動化配置。那么在該庫中是如何做到這種實現的?
其實在spring boot應用啟動中會獲取應用的ClassLoader進而獲得所有jar包並且將讀取每個jar包下的META-INF/spring.factories
具體源碼項目可以參考如下spring源碼,源碼從入口SpringApplication.run、SpringApplicationRunListeners listeners = getRunListeners(args);、getSpringFactoriesInstances、loadFactoryNames,如下圖spring源碼。
因此可以在組件中定義spring.factories文件,進行需要的組件配置並且不會影響到其他地方的配置,也不會被別人的配置覆蓋。比原先的xml中進行配置,系統開發者無需關注內部組件配置過程而只需要關注該組件是否能夠解決他們所遇到的問題。那么在該文件中能夠定義哪些內容?
## Initializers
## ApplicationContextInitializer接口的作用是可以在ApplicationContext初始化之前,對Spring上下文屬性進行修改,既refresh()前的一個鈎子函數。
org.springframework.context.ApplicationContextInitializer
## Application Listeners
## ApplicationListener 是Spring的監聽器,可以通過對Spring上下文發送消息事件(由ApplicationContext. publishEvent進行消息發送),由對應的監聽器進行捕獲處理。
org.springframework.context.ApplicationListener
## Auto Configuration Import Listeners
## 當Spring使用ConfigurationClassParser加載完所有@Configuration后會再一次使用AutoConfigurationImportSelector排除所有不符合條件的@Configuration,排除完后則回調所有AutoConfigurationImportListener的監聽器。可相當於加載並過濾完@Configuration后的鈎子回調。
org.springframework.boot.autoconfigure.AutoConfigurationImportListener
# Auto Configuration Import Filters
# 為 org.springframework.boot.autoconfigure.EnableAutoConfiguration定義的所有配置類增加ImportFilter來決定是否進行配置
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter
# Auto Configure
# 定義自動裝配config類,當系統引入該jar包時, spring上下文將初始化這些config類
org.springframework.boot.autoconfigure.EnableAutoConfiguration
# Failure analyzers
# 當spring bean的調用方法拋出特定異常時由自定義的特定FailureAnalyzer進行捕獲並且進行處理。
org.springframework.boot.diagnostics.FailureAnalyzer
# Template availability providers
# 定義jar內可用的模板轉換器 在前后端分離場景下一般很少用的到。
org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider