美文网首页
Spring Boot:初始化

Spring Boot:初始化

作者: ryancao_b9b9 | 来源:发表于2020-03-28 18:50 被阅读0次

    一、构建Spring Boot示例应用
    1、配置POM

     <!-- Inherit defaults from Spring Boot -->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
        </parent>
    
        <!-- Add typical dependencies for a web application -->
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
    ...
    

    2、编写应用

    @SpringBootApplication
    @NacosPropertySource(dataId = "learning", autoRefreshed = true)
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    3、启动应用

    
    ██████╗ ███████╗██████╗ ███████╗███████╗██╗   ██╗███████╗
    ██╔══██╗██╔════╝██╔══██╗██╔════╝██╔════╝██║   ██║██╔════╝
    ██████╔╝█████╗  ██████╔╝███████╗█████╗  ██║   ██║███████╗
    ██╔═══╝ ██╔══╝  ██╔══██╗╚════██║██╔══╝  ██║   ██║╚════██║
    ██║     ███████╗██║  ██║███████║███████╗╚██████╔╝███████║
    ╚═╝     ╚══════╝╚═╝  ╚═╝╚══════╝╚══════╝ ╚═════╝ ╚══════╝
                                                             
     :: Perseus ::        (v0.0.1)
    
    2020-03-28 19:56:03.196  INFO 56682 --- [           main] e.OverrideDubboConfigApplicationListener : Dubbo Config was overridden by externalized configuration {dubbo.application.name=learning, dubbo.application.qos-enable=false, dubbo.config.multiple=true, dubbo.registry.address=nacos://mars.logithing.com:8848}
    2020-03-28 19:56:03.270  INFO 56682 --- [           main] com.falcon.Application                   : Starting Application on 192.168.1.101 with PID 56682 (/Users/ryan/Documents/Bitbucket/learning/target/classes started by ryan in /Users/ryan/Documents/Bitbucket/mars)
    2020-03-28 19:56:03.270  INFO 56682 --- [           main] com.falcon.Application                   : No active profile set, falling back to default profiles: default
    2020-03-28 19:56:03.299  INFO 56682 --- [           main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@68f4865: startup date [Sat Mar 28 19:56:03 CST 2020]; root of context hierarchy
    2020-03-28 19:56:05.980  INFO 56682 --- [           main] .a.d.c.s.c.a.DubboConfigBindingRegistrar : The dubbo config bean definition [name : org.apache.dubbo.config.ApplicationConfig#0, class : org.apache.dubbo.config.ApplicationConfig] has been registered.
    2020-03-28 19:56:05.980  INFO 56682 --- [           main] .a.d.c.s.c.a.DubboConfigBindingRegistrar : The BeanPostProcessor bean definition [org.apache.dubbo.config.spring.beans.factory.annotation.DubboConfigBindingBeanPostProcessor] for dubbo config bean [name : org.apache.dubbo.config.ApplicationConfig#0] has been registered.
    2020-03-28 19:56:05.981  INFO 56682 --- [           main] .a.d.c.s.c.a.DubboConfigBindingRegistrar : The dubbo config bean definition [name : org.apache.dubbo.config.RegistryConfig#0, class : org.apache.dubbo.config.RegistryConfig] has been registered.
    2020-03-28 19:56:05.981  INFO 56682 --- [           main] .a.d.c.s.c.a.DubboConfigBindingRegistrar : The BeanPostProcessor bean definition [org.apache.dubbo.config.spring.beans.factory.annotation.DubboConfigBindingBeanPostProcessor] for dubbo config bean [name : org.apache.dubbo.config.RegistryConfig#0] has been registered.
    2020-03-28 19:56:05.981  INFO 56682 --- [           main] .a.d.c.s.c.a.DubboConfigBindingRegistrar : The dubbo config bean definition [name : org.apache.dubbo.config.ProtocolConfig#0, class : org.apache.dubbo.config.ProtocolConfig] has been registered.
    2020-03-28 19:56:05.981  INFO 56682 --- [           main] .a.d.c.s.c.a.DubboConfigBindingRegistrar : The BeanPostProcessor bean definition [org.apache.dubbo.config.spring.beans.factory.annotation.DubboConfigBindingBeanPostProcessor] for dubbo config bean [name : org.apache.dubbo.config.ProtocolConfig#0] has been registered.
    2020-03-28 19:56:06.035  INFO 56682 --- [           main] b.f.a.ServiceAnnotationBeanPostProcessor :  [DUBBO] BeanNameGenerator bean can't be found in BeanFactory with name [org.springframework.context.annotation.internalConfigurationBeanNameGenerator], dubbo version: 2.7.3, current host: 192.168.1.101
    2020-03-28 19:56:06.036  INFO 56682 --- [           main] b.f.a.ServiceAnnotationBeanPostProcessor :  [DUBBO] BeanNameGenerator will be a instance of org.springframework.context.annotation.AnnotationBeanNameGenerator , it maybe a potential problem on bean name generation., dubbo version: 2.7.3, current host: 192.168.1.101
    2020-03-28 19:56:06.044  INFO 56682 --- [           main] b.f.a.ServiceAnnotationBeanPostProcessor :  [DUBBO] The BeanDefinition[Root bean: class [org.apache.dubbo.config.spring.ServiceBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] of ServiceBean has been registered with name : ServiceBean:com.falcon.service.HelloService:1.0.0:learning_service, dubbo version: 2.7.3, current host: 192.168.1.101
    2020-03-28 19:56:06.044  INFO 56682 --- [           main] b.f.a.ServiceAnnotationBeanPostProcessor :  [DUBBO] 1 annotated Dubbo's @Service Components { [Bean definition with name 'helloServiceImpl': Generic bean: class [com.falcon.service.impl.HelloServiceImpl]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [/Users/ryan/Documents/Bitbucket/learning/target/classes/com/falcon/service/impl/HelloServiceImpl.class]] } were scanned under package[com.falcon.service], dubbo version: 2.7.3, current host: 192.168.1.101
    2020-03-28 19:56:06.045  WARN 56682 --- [           main] o.s.c.a.ConfigurationClassPostProcessor  : Cannot enhance @Configuration bean definition 'org.apache.dubbo.spring.boot.autoconfigure.DubboRelaxedBinding2AutoConfiguration' since its singleton instance has been created too early. The typical cause is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor return type: Consider declaring such methods as 'static'.
    2020-03-28 19:56:06.045  WARN 56682 --- [           main] o.s.c.a.ConfigurationClassPostProcessor  : Cannot enhance @Configuration bean definition 'org.apache.dubbo.spring.boot.autoconfigure.DubboAutoConfiguration' since its singleton instance has been created too early. The typical cause is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor return type: Consider declaring such methods as 'static'.
    2020-03-28 19:56:06.228  INFO 56682 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'relaxedDubboConfigBinder' of type [org.apache.dubbo.spring.boot.autoconfigure.BinderDubboConfigBinder] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
    2020-03-28 19:56:06.233  INFO 56682 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'relaxedDubboConfigBinder' of type [org.apache.dubbo.spring.boot.autoconfigure.BinderDubboConfigBinder] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
    2020-03-28 19:56:06.234  INFO 56682 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'relaxedDubboConfigBinder' of type [org.apache.dubbo.spring.boot.autoconfigure.BinderDubboConfigBinder] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
    2020-03-28 19:56:06.432  INFO 56682 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8078 (http)
    

    二、SpringApplication.run内部流程
    1、实例化SpringApplication,调用run方法

    public static ConfigurableApplicationContext run(Class<?>[] primarySources,
                String[] args) {
            return new SpringApplication(primarySources).run(args);
        }
    

    2、SpringApplication构造过程

    public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
            this.resourceLoader = resourceLoader;
            Assert.notNull(primarySources, "PrimarySources must not be null");
            this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));// 把sources设置到SpringApplication的sources属性中
            this.webApplicationType = deduceWebApplicationType();// 判断是否是web程序,并设置到webEnvironment属性中
            setInitializers((Collection) getSpringFactoriesInstances(
                    ApplicationContextInitializer.class)); // 从spring.factories文件中找出key为ApplicationContextInitializer的类并实例化后设置到SpringApplication的initializers属性中
            setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));// 从spring.factories文件中找出key为ApplicationListener的类并实例化后设置到SpringApplication的listeners属性中
            this.mainApplicationClass = deduceMainApplicationClass();
        }
    

    说明:
    *deduceWebApplicationType:判断Web环境(Servlet/Reactive)
    *setInitializers:加载ApplicationContextInitializer实例列表,根据类型、配置文件( META-INF/spring.factories)加载相应类,示例结果:

    initializers = {ArrayList@952}  size = 6
     0 = {DubboApplicationContextInitializer@1057} 
     1 = {ContextIdApplicationContextInitializer@1058} 
     2 = {ConfigurationWarningsApplicationContextInitializer@1059} 
     3 = {ServerPortInfoApplicationContextInitializer@1060} 
     4 = {SharedMetadataReaderFactoryContextInitializer@1061} 
     5 = {AutoConfigurationReportLoggingInitializer@1062} 
    

    spring.factories中加载类的机制

    private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object... args) {
        ClassLoader classLoader Thread.currentThread().getContextClassLoader();
        // Use names and ensure unique to protect against duplicates
        Set<String> names = new LinkedHashSet<>(SpringFactoriesLoader.loadFactoryNames(type, classLoader));加载spring.factories,以type为key读取相应的值
        List<T> instances = createSpringFactoriesInstances(type, parameterTypes,classLoader, args, names);//实例化读取到的值
        AnnotationAwareOrderComparator.sort(instances);//将实例排序并返回
        return instances;
    }
    

    *setListeners:加载ApplicationListener实例列表

    listeners = {ArrayList@1055}  size = 10
     0 = {ConfigFileApplicationListener@1067} 
     1 = {AnsiOutputApplicationListener@1068} 
     2 = {LoggingApplicationListener@1069} 
     3 = {ClasspathLoggingApplicationListener@1070} 
     4 = {BackgroundPreinitializer@1071} 
     5 = {DelegatingApplicationListener@1072} 
     6 = {ParentContextCloserApplicationListener@1073} 
     7 = {ClearCachesApplicationListener@1074} 
     8 = {FileEncodingApplicationListener@1075} 
     9 = {LiquibaseServiceLocatorApplicationListener@1076} 
    

    *deduceMainApplicationClass:推断程序入口(即添加了SpringBootApplication的****App.class)

    相关文章

      网友评论

          本文标题:Spring Boot:初始化

          本文链接:https://www.haomeiwen.com/subject/jmhsuhtx.html