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

猜你喜欢

转载自blog.csdn.net/beyondself_77/article/details/80829871