水稻網(wǎng)站做go分析網(wǎng)絡(luò)營銷有本科嗎
目錄
微服務(wù)架構(gòu)時代
快速入門
入門詳解
SpringBoot的自動配置
石器時代:XML配置bean
青銅時代:SpringConfig
鐵器時代:AutoConfigurationImportSelector
手寫簡單Starter
SpringApplication啟動原理
微服務(wù)架構(gòu)時代
Spring Boot的出現(xiàn)與微服務(wù)架構(gòu)有關(guān),它是Spring Framework的一部分,旨在簡化開發(fā)獨立的、可執(zhí)行的Java應(yīng)用程序。Spring Boot解決了傳統(tǒng)Java應(yīng)用程序開發(fā)中的繁瑣配置問題,使開發(fā)人員能夠更快速地構(gòu)建微服務(wù)和獨立應(yīng)用程序。
快速入門
如果要快速入門,這個傳送門一定很有幫助------->Spring | Quickstart
入門詳解
Spring入門詳解的部分諸君可以看一下這篇文章:
SpringBoot入門詳解-CSDN博客
SpringBoot的自動配置
石器時代:XML配置bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">
?<!-- 聲明一個名為 myBean 的 Bean --><bean id="myBean" class="com.elaine.MyBean"><property name="name" value="elaine"/></bean>
?
</beans>
青銅時代:SpringConfig
@Configuration
public class MyConfiguration {
?@Beanpublic MyBean myBean() {MyBean bean = new MyBean();bean.setName("Elaine");return bean;}
}
鐵器時代:AutoConfigurationImportSelector
SpringBoot開啟自動配置的注解是@EnableAutoConfiguration,但是自動配置的核心功能是通過AutoConfigurationImportSelector實現(xiàn)的。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
?Class<?>[] exclude() default {};
?String[] excludeName() default {};
}
-
AutoConfigurationImportSelector實現(xiàn)ImportSelector接口,收集需要導(dǎo)入的配置類,配合@Import將相應(yīng)的類導(dǎo)入到Spring容器中。
-
獲取注?類的?法是 selectImports(),它實際調(diào)?的是 getAutoConfigurationEntry ,這個?法是獲取?動裝配類的關(guān)鍵,主要流程可以分為這么?步:
-
獲取注解的屬性,用于后面的排除
-
獲取所有需要?動裝配的配置類的路徑:這?步是最關(guān)鍵的,從 META-INF/spring.factories 獲取?動 配置類的路徑
-
去掉重復(fù)的配置類和需要排除的重復(fù)類,把需要?動加載的配置類的路徑存儲起來
-
public String[] selectImports(AnnotationMetadata annotationMetadata) {if (!this.isEnabled(annotationMetadata)) {return NO_IMPORTS;} else {AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());}}
?protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {if (!this.isEnabled(annotationMetadata)) {return EMPTY_ENTRY;} else {// 1.獲取注解的屬性AnnotationAttributes attributes = this.getAttributes(annotationMetadata);// 2.獲取需要?動裝配的所有配置類,讀取META-INF/spring.factories,獲取?動配置類路徑List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);// 3.1.移除重復(fù)的配置configurations = this.removeDuplicates(configurations);// 3.2.處理需要排除的配置Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);this.checkExcludedClasses(configurations, exclusions);configurations.removeAll(exclusions);configurations = this.getConfigurationClassFilter().filter(configurations);this.fireAutoConfigurationImportEvents(configurations, exclusions);return new AutoConfigurationEntry(configurations, exclusions);}}
手寫簡單Starter
在了解自動配置的原理后,就簡單地創(chuàng)建一個自定義的spring-boot-starter吧。
文件目錄貼一下:
-
創(chuàng)建自動配置類和需要定義的bean。
@Configuration public class MyUserAutoConfiguration {@Beanpublic UserManager userManager(){return new UserManager();} } public class UserManager {public String sayHello() {return "own-starter:hello.";} }
-
在
src/main/resources/META-INF/
目錄下創(chuàng)建一個spring.factories
文件org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.lloyd.user.MyUserAutoConfiguration
-
創(chuàng)建一個spring-web的SpringBoot項目,添加自定義Starter的依賴。
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 自定義starter的坐標(biāo) --><dependency><groupId>com.lloyd</groupId><artifactId>springboot_06_own_starter</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
-
創(chuàng)建一個Rest接口進行驗證
@RestController public class UserController {@Autowiredprivate UserManager userManager; ?@GetMapping("/user")public String sayHello(){return userManager.sayHello();} }
瀏覽器結(jié)果:
SpringApplication啟動原理
SpringApplication 這個類主要做了以下四件事情:
-
推斷應(yīng)?的類型是普通的項?還是 Web 項?
-
查找并加載所有可?初始化器 , 設(shè)置到 initializers 屬性中
-
找出所有的應(yīng)?程序監(jiān)聽器,設(shè)置到 listeners 屬性中
-
推斷并設(shè)置 main ?法的定義類,找到運?的主類
大致流程如下(圖片來自于網(wǎng)絡(luò)):