栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Springboot启动项流程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Springboot启动项流程

启动阶段:

每个springBoot程序都有一个主入口,也就是main方法,main方法调用springApplication.run()启动整个spring boot程序,该方法所在的类有一个@SpringBootApplication注解,它是一个组合注解

spring启动类:
@SpringBootAppclation
public class SpringRunAppliction(){
    public static void main(String[]  args ){   
        //spring中最先启动的部分                 
        //加载该文件,加载@SpringBootApplaction注解
        SpringAppliction.run(RunApp.calss); 
    }
}
@SpringBootApplication注解的组成:
@Target(ElementType.TYPE)                         //对类有效
@Retention(RetentionPolicy.RUNTIME)               //运行期有效执行
@documented                                       //生成源码时是否生成动态文档        
@Inherited                                        //标识注解是否可以被继承
//修饰主启动类,标识这是一个扫描并配置用户自己的配置类,并实例化对。由主启动类加载所有其他配置类
@SpringBootConfiguration                  
 
//加载根据用户配置加载jar包
@EnableAutoConfiguration                
 
//扫描包配置
@ComponentScan(
//排除特定的类型(excludeFilters排斥过滤器)
    excludeFilters = { @Filter(type = FilterType.CUSTOM, classes =             
    TypeExcludeFilter.class
),        
      @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
    
    @AliasFor(annotation = EnableAutoConfiguration.class)
	Class[] exclude() default {};

    
    @AliasFor(annotation = EnableAutoConfiguration.class)
	String[] excludeName() default {};

    
    @AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
	String[] scanbasePackages() default {};
    
	@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
	Class[] scanbasePackageClasses() default {};
    
    
	@AliasFor(annotation = Configuration.class)
	boolean proxyBeanMethods() default true;

@SpringBootConfiguration

修饰主启动类,表示这是一个配置类,只是简单地继承自@Configuration

一个架构只能有一个SpringBootConfigration

@Target(ElementType.TYPE)                  //对类有效
@Retention(RetentionPolicy.RUNTIME)        //运行期有效执行
@documented                                //生成源码时是否生成动态文档 
@Cofiguration              //@Configuration 配置文件 配置类,整合当前类中的第三方框架(配置)
public @interface SpringBootConfiguration { 
    
    @AliasFor(annotation = Configuration.class)
    boolean proxyBeanMethods() default true;
}

@Configuration,标志这是一个配置类, 一般用于标识类文件,告知SpringBoot程序,这个类是整合第三方框架/配置类

@EnableAutoConfiguration

启用Spring应用程序上下文的自动配置,尝试猜测和配置您可能需要的bean。自动配置类通常基于类路径和定义的bean应用。

使用@SpringBootApplication注解启动时,会自动启用上下文的自动配置,因此添加此注释不会产生额外的效果

自动配置尝试尽可能智能化,并在您定义更多自己的配置时退出。您始终可以手动在exclude属性中排除任何不想应用的配置(如果您没有访问权限,请使用excludeName()。您还可以通过实用配置的spring.autoconfigure.exclude属性排除它们。自动配置总是在注册用户定义的bean之后应用

 用@EnableAutoConfiguration注释的类的包,自动装配,通常用作“默认值”。例如,它将在扫描@Entity类时使用。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@documented
@Inherited
//自动配置包 : 会把@springbootApplication注解标注的类所在包名拿到,
//并且对该包及其子包进行扫描,将组件添加到容器中
@AutoConfigurationPackage		
//可以帮助springboot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot
//并创建并使用的IoC容器(ApplicationContext)中
@import(AutoConfigurationimportSelector.class)  
public @interface EnableAutoConfiguration {
}
 @AutoConfigurationPackage

启动自动配置包扫描的路径,工作原理:自动动态获取主启动类的包路径,开启包扫描的机制
(代码都要写在主启动类的同包及子包类)。注册当前主程序的同级以及子集的包组件,其实就是注册了一个Bean的定义

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@documented
@Inherited
@import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
}
@import(AutoConfigurationimportSelector.class)

@import也是Spring原生提供的注解,通过该注解讲Registrar类导入到容器中。

springboot体现了开箱即用的设计思想,用户引入配置之后,只需少量配置(配置config文件)就可以直接使用 

将其他的包加入自己的项目中,负责加载但不运行

主启动执行时,内部会加载@import(AutoConfigurationimportSelector.class),该注解的作用就是根据依赖信息,扫描并加载进来的“启动器”。Springboot内部的多个启动器会根据用户的加载,执行对应的jar包,最终整合所有需要的框架

AutoConfigurationimportSelector.class

帮助Spring应用将所有的符合条件的@Configuration中的配置类加载到工厂中,告知其需要导入哪一些的组件,进入该类,有一些重要的方法需要解析

@ComponentScan()

组件扫描,可以自动发现并包装Bean,自动扫描并加载符合的组件(比如@Component和@Pepository等)或者Bean定义,最终将这些bean定义下载到IoC容器中

@ComponentScan(excludeFilters = { 
    @Filter(type = FilterType.CUSTOM,classes =TypeExcludeFilter.class),
    @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) 
})

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/324518.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号