• springboot运行原理


    springboot的特点:大量的注解封装、约定大于配置的原则。

    Spring Boot框架本质上就是通过组合注解的方式实现了诸多Spring注解的组合,从而极大地简化了Spring框架本身的繁琐配置,实现快速的集成和开发。

    Spring注解则是基于JDK1.5+后的注解功能的支持来完成的。

    元注解,所谓的元注解,就是可以注解到其他注解上的注解,被注解的注解就是我们上面说到的组合注解

    Spring Boot运行原理

     

    @SpringBootApplication注解实际上是一个组合注解,除了对应用开放的@ComponentScan注解(实现对开发者自定义的应用包扫描)外,其最核心的注解就是@EnableAutoConfiguration,该注解表示开启自动配置功能,而在具体的实现上则是通过导入@Import(EnableAutoConfigurationImportSelector.class)类的实例,在逻辑上实现了对所依赖的核心jar下META-INF/spring.factories文件的扫描,该文件则声明了有哪些自动配置需要被Spring容器加载,从而Spring Boot应用程序就能自动加载Spring核心容器配置,以及其他依赖的项目组件配置,从而最终完成应用的自动初始化,通过这种方法就向开发者屏蔽了启动加载的过程。

    如“spring-boot-autoconfigure”核心包中的META-INF/spring.factories文件就是定义了需要加载的Spring Boot项目所依赖的基础配置类,如Spring的容器初始化配置类等。如:

    # Initializers
    org.springframework.context.ApplicationContextInitializer=
    org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,
    org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
    
    # Application Listeners
    org.springframework.context.ApplicationListener=
    org.springframework.boot.autoconfigure.BackgroundPreinitializer
    

      



    .....
    	public String[] selectImports(AnnotationMetadata annotationMetadata) {
    		if (!isEnabled(annotationMetadata)) {
    			return NO_IMPORTS;
    		}
    		try {
    			AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
    					.loadMetadata(this.beanClassLoader);
    			AnnotationAttributes attributes = getAttributes(annotationMetadata);
    			List<String> configurations = getCandidateConfigurations(annotationMetadata,
    					attributes);
    			configurations = removeDuplicates(configurations);
    			configurations = sort(configurations, autoConfigurationMetadata);
    			Set<String> exclusions = getExclusions(annotationMetadata, attributes);
    			checkExcludedClasses(configurations, exclusions);
    			configurations.removeAll(exclusions);
    			configurations = filter(configurations, autoConfigurationMetadata);
    			fireAutoConfigurationImportEvents(configurations, exclusions);
    			return configurations.toArray(new String[configurations.size()]);
    		}
    		catch (IOException ex) {
    			throw new IllegalStateException(ex);
    		}
    	}
    

      

     
    	protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,
    			AnnotationAttributes attributes) {
    		List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
    				getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
    		Assert.notEmpty(configurations,
    				"No auto configuration classes found in META-INF/spring.factories. If you "
    						+ "are using a custom packaging, make sure that file is correct.");
    		return configurations;
    	}
    

      

    而对于大部分第三方需要与Spring Boot集成的框架,或者我们日常开发中需要进行抽象的公共组件而言,得益于这种机制,也可以很容易地定制成开箱即用的各种Starter组件。而使用这些组件的用户,往往只需要将依赖引入就好,不再需要进行任何额外的配置了!

  • 相关阅读:
    关于相对定位与绝对定位
    一些常用但不平凡的CSS属性
    Java-认识变量、注释并能及时发现错误
    了解Java并学会创建Java项目(一个菜鸟的成长历程)
    竞态条件
    web服务器原理
    信号
    静态网页与动态网页区别
    mmap
    HTTP协议
  • 原文地址:https://www.cnblogs.com/jyzyz/p/10573491.html
Copyright © 2020-2023  润新知