SOFABoot源碼解析之啓動原理(1)-註解分析

一 、概述

        SOFABoot是螞蟻金服開源的基於 Spring Boot 的研發框架,它在Spring Boot 的基礎上,提供了諸如 Readiness Check,類隔離,日誌空間隔離等等能力。在增強了 Spring Boot 的同時,SOFABoot 提供了讓用戶可以在 SpringBoot中非常方便地使用 SOFA 中間件的能力。

         爲了基於SOFABoot框架進行研發,建議大家熟讀一下《SpringBoot參考指南》這本書。SpringBoot參考指南有html,pdf和epub等形式的文檔,大家可以從http://docs.spring.io/spring-boot/docs/current/reference獲取到最新版本。

        在此,通過詳細地描述SpringBoot內部啓動原理,爲大家基於SOFABoot框架進行開發提供快速入門。

        由於SOFABoot基於SpringBoot項目,所以會用到SpringBoot的啓動類:

1.  @SpringBootApplication
2.  @ImportResource({"classpath*:rpc-starter-example.xml" })
3.  public class SofaBootRpcDemoApplication {
4.   
5.      public static void main(String[] args)throws InterruptedException {
6.       
7.          ApplicationContext applicationContext =SpringApplication.run(SofaBootRpcDemoApplication.class, args);
8.   
9.      }
10. }
        @SpringBootApplication和SpringApplication.run開始,我們逐步分析SpringBoot的啓動原理。

        首先,看一下註解@SpringBootApplication的定義:

1.  @Target(ElementType.TYPE)
2.  @Retention(RetentionPolicy.RUNTIME)
3.  @Documented
4.  @Inherited
5.  @SpringBootConfiguration
6.  @EnableAutoConfiguration
7.  @ComponentScan(excludeFilters =@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class))
8.  public @interface SpringBootApplication {
9.  ……
10. }

       @SpringBootApplication是一個複合Annotation,使用了多個Annotation進行了原信息標註,其中3個比較關鍵的Annotation分別爲:

         1. @SpringBootConfiguration,實際使用@Configuration;

         2. @EnableAutoConfiguration;

         3. @ComponentScan;

二、@Configuration

        @Configuration註解是JavaConfig形式的Spring Ioc容器的配置類,可替換Spring XML配置文件。

   被@Configuration註解的配置類包含一個或多個被@Bean註解的方法,這些方法將會被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext類進行掃描,並用於構建bean定義,初始化Spring容器。

        @Configuration註解的配置類有如下要求:

        1.   @Configuration不可以是final類型;

        2.   @Configuration不可以是匿名類;

        3.   嵌套的configuration必須是靜態類。

        代碼示例如下:

1.  @Configuration
2.  public class TestConfiguration {
3.      public TestConfiguration() {
4.          System.out.println("TestConfiguration容器啓動初始化。。。");
5.      }
6.   
7.      // @Bean註解註冊bean,同時可以指定初始化和銷燬方法
8.      //@Bean(name="testBean",initMethod="start",destroyMethod="cleanUp")
9.      @Bean
10.     @Scope("prototype")
11.     public TestBean testBean() {
12.         return new TestBean();
13.     }
14. }

        SpringBoot社區推薦使用基於JavaConfig的配置形式。所以,這裏的啓動類標註了@Configuration之後,本身其實也是一個IoC容器的配置類。

三、@ComponentScan

        @ComponentScan註解對應Spring XML文件中的 <context:component-scan>元素。

        @ComponentScan的功能是自動掃描並加載符合條件的組件(比如@Component和@Repository等)的bean定義,最終將這些bean定義加載到IoC容器中。

        通過basePackages、basePackageClasses、includeFilters、excludeFilters等屬性來細粒度的定製@ComponentScan自動掃描的範圍,在此只描述比較常用的兩個屬性,其它屬性自行查閱相關資料。

        1.   basePackages:掃描basePackages中指定的package及其子package中聲明的組件。

        2.   basePackageClasses:掃描basePackageClasses中指定的類所在的package及其子package中聲明的組件。

        如果不指定,則默認Spring框架實現會從聲明@ComponentScan所在類的package進行掃描。所以,SpringBoot的啓動類最好是放在root package下,因爲默認不指定basePackages。

四、@EnableAutoConfiguration

        @EnableAutoConfiguration註解的自動配置功能是從classpath中搜尋所有的META-INF/spring.factories配置文件(項目及該項目依賴的Jar包),並將其中org.springframework.boot.autoconfigure.EnableAutoConfiguration對應的配置項通過反射機制實例化爲對應的標註了@Configuration的JavaConfig形式的IoC容器配置類,然後加載到IoC容器。

        @Enable*註釋並不是新發明的註解,早在Spring 3框架就引入了這些註解,用這些註釋替代XML配置文件。

        很多Spring開發者都知道@EnableTransactionManagement註解,它能夠聲明事務管理;@EnableWebMvc註解,它能啓用Spring MVC;@EnableScheduling註解,它可以初始化一個調度器;@EnableMBeanExport是通過@Import將JMX相關的bean定義加載到IoC容器。這些註解事實上都是簡單的配置,通過@Import註解導入。  

        @EnableAutoConfiguration也是藉助@Import的幫助,將所有符合自動配置條件的bean定義加載到IoC容器。

        @EnableAutoConfiguration是一個複合Annotation,其自身定義關鍵信息如下:

1.  @Target(ElementType.TYPE)
2.  @Retention(RetentionPolicy.RUNTIME)
3.  @Documented
4.  @Inherited
5.  @AutoConfigurationPackage
6.  @Import(EnableAutoConfigurationImportSelector.class)
7.  public @interface EnableAutoConfiguration{
8.  ……
9.  }

        其中,最關鍵部分爲@Import(EnableAutoConfigurationImportSelector.class)。藉助EnableAutoConfigurationImportSelector功能,@EnableAutoConfiguration可以幫助SpringBoot應用將所有符合條件的@Configuration配置都加載到當前SpringBoot創建並使用的IoC容器。

        EnableAutoConfigurationImportSelector類使用SpringFactoriesLoader類的loadFactoryNamesof()方法,而SpringFactoriesLoader會查詢所有加載的Jar包中的META-INF/spring.factories文件。

        SpringFactoriesLoader屬於Spring框架私有的一種擴展方案,其主要功能就是從指定的配置文件META-INF/spring.factories加載配置。藉助於SpringFactoriesLoader的支持,@EnableAutoConfiguration可以實現智能的自動配置功能。

        當找到spring.factories文件後,SpringFactoriesLoader以@EnableAutoConfiguration類的全限定類名org.springframework.boot.autoconfigure.EnableAutoConfiguration作爲查找的Key,獲取對應的一組@Configuration類。

        讓我們來看看spring-boot-autoconfigure模塊的Jar包,它包含了一個spring.factories文件,內容如下:

1.  # Initializers
2.  org.springframework.context.ApplicationContextInitializer=\
3.  org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
4.  org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer
5.   
6.  # Application Listeners
7.  org.springframework.context.ApplicationListener=\
8.  org.springframework.boot.autoconfigure.BackgroundPreinitializer
9.   
10. # Auto Configure
11. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
12. org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
13. org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
14. org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
15. org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration,\
16. org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration,\
17. org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
18. org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
19. org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
20. org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
21. org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
22. org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
23. org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
24. org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
25. org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
26. org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
27. org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
28. org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\
29. org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
30. org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
31. org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
32. org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
33. org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
34. org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
35. org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
36. org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
37. org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
38. org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
39. org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
40. org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
41. org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,\
42. org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
43. org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
44. org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\
45. org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\
46. org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\
47. org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\
48. org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\
49. org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\
50. org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
51. org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
52. org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
53. org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
54. org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
55. org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
56. org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\
57. org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\
58. org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\
59. org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\
60. org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\
61. org.springframework.boot.autoconfigure.jms.hornetq.HornetQAutoConfiguration,\
62. org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
63. org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
64. org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
65. org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
66. org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
67. org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
68. org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\
69. org.springframework.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration,\
70. org.springframework.boot.autoconfigure.mobile.DeviceDelegatingViewResolverAutoConfiguration,\
71. org.springframework.boot.autoconfigure.mobile.SitePreferenceAutoConfiguration,\
72. org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\
73. org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
74. org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
75. org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
76. org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration,\
77. org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\
78. org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration,\
79. org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,\
80. org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration,\
81. org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
82. org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
83. org.springframework.boot.autoconfigure.social.SocialWebAutoConfiguration,\
84. org.springframework.boot.autoconfigure.social.FacebookAutoConfiguration,\
85. org.springframework.boot.autoconfigure.social.LinkedInAutoConfiguration,\
86. org.springframework.boot.autoconfigure.social.TwitterAutoConfiguration,\
87. org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
88. org.springframework.boot.autoconfigure.velocity.VelocityAutoConfiguration,\
89. org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
90. org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
91. org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
92. org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,\
93. org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,\
94. org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration,\
95. org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration,\
96. org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration,\
97. org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration,\
98. org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration,\
99. org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration,\
100. org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,\
101. org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,\
102. org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,\
103. org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration
104.  
105. # Failure analyzers
106. org.springframework.boot.diagnostics.FailureAnalyzer=\
107. org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\
108. org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,\
109. org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer
110.  
111. # Template availability providers
112. org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\
113. org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider,\
114. org.springframework.boot.autoconfigure.mustache.MustacheTemplateAvailabilityProvider,\
115. org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAvailabilityProvider,\
116. org.springframework.boot.autoconfigure.thymeleaf.ThymeleafTemplateAvailabilityProvider,\
117. org.springframework.boot.autoconfigure.velocity.VelocityTemplateAvailabilityProvider,\
118. org.springframework.boot.autoconfigure.web.JspTemplateAvailabilityProvider

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章