当前位置: 首页 > 后端技术 > Java

8.SpringBoot启动流程--创建一个spring应用

时间:2023-04-01 17:48:26 Java

分为两步:①创建spring应用②运行spring应用1.创建SpringApplication@SpringBootApplicationpublicclassBoot09HelloTestApplication{publicstaticvoidmain(String[]args){弹簧应用程序。运行(Boot09HelloTestApplication.class,参数);}}stepinto使用newclass传入主程序类,然后调用run方法publicstaticConfigurableApplicationContextrun(ClassprimarySource,String...args){returnrun(newClass[]{primarySource},args);}stepintorun方法的第一步是创建一个spring应用程序。第二步运行spring应用publicstaticConfigurableApplicationContextrun(Class[]primarySources,String[]args){return(newSpringApplication(primarySources)).run(args);}stepinto看创建springapplication流程是什么publicSpringApplication(Class...primarySources){//带参构造函数调用这个类,传入两个参数this((ResourceLoader)null,primarySources);}stepinto这个方法初始化了很多属性publicSpringApplication(ResourceLoaderresourceLoader,Class...primarySources){//第一个属性,资源加载器resourceLoaderthis.resourceLoader=resourceLoader;//断言你有主配置类,如果没有则报错Assert.notNull(primarySources,"PrimarySourcesmustnotbenull");//保存主要的配置类信息,this.primarySources=newLinkedHashSet<>(Arrays.asList(primarySources));//判断当前web应用的类型。有关如何决定的信息,请参见下面的源代码。this.webApplicationType=WebApplicationType.deduceFromClasspath();//bootstrappers:初始引导程序(项目启动后立即执行的操作)。请参阅下面的源代码以了解如何获取它。this.bootstrappers=newArrayList<>(getSpringFactoriesInstances(Bootstrapper.class));//设置初始化器。只要看到getSpringFactoriesInstances这个方法,就会去META-INF/spring.factories文件中查看是否配置了某个类,它的值是多少//如果找到ApplicationContextInitializer,就会放在List>setInitializers((Collection)getSpringFactoriesInstances(ApplicationContextInitializer.class))在初始化器中;//设置监听器。检查spring.factories文件中是否配置了ApplicationListener类,它的值是多少setListeners((Collection)getSpringFactoriesInstances(ApplicationListener.class));//找到主程序。确定哪个是主程序。如何决定请看下面的源码分析。this.mainApplicationClass=deduceMainApplicationClass();}如何判断当前web应用的类型??Servlet还是响应式编程?staticWebApplicationTypededuceFromClasspath(){//使用ClassUtils工具类判断当前系统是否导入了用于org.springframework.web.reactive.DispatcherHandler响应式编程的请求处理器if(ClassUtils.isPresent(WEBFLUX_INDICATOR_CLASS,null)&&!ClassUtils.isPresent(WEBMVC_INDICATOR_CLASS,null)&&!ClassUtils.isPresent(JERSEY_INDICATOR_CLASS,null)){//如果是响应式编程,相当于导入了DispatcherHandler类,会返回是响应式编程returnWebApplicationType.REACTIVE;}//如果是Nativeservlet编程for(StringclassName:SERVLET_INDICATOR_CLASSES){if(!ClassUtils.isPresent(className,null)){returnWebApplicationType.NONE;}}//如果是原生servlet编程,则返回是原生servlet编程returnWebApplicationType.SERVLET;}如何获取初始化启动器??privateCollectiongetSpringFactoriesInstances(Classtype){returngetSpringFactoriesInstances(type,newClass[]{});}//进入getSpringFactoriesInstances方法privateCollectiongetSpringFactoriesInstances(Classtype,Class[]parameterTypes,Object...args){//获取类加载器ClassLoaderclassLoader=getClassLoader();//在spring.factories文件中找到类型为org.springframework.boot.BootstrapperSetnames=newLinkedHashSet<>(SpringFactoriesLoader.loadFactoryNames(type,classLoader));//如果没有找到,即没有人配置它如果是,则创建并返回一个实例Listinstances=createSpringFactoriesInstances(type,parameterTypes,classLoader,args,names);AnnotationAwareOrderComparator.sort(实例);returninstances;}如何判断哪个是主程序???privateClassdeduceMainApplicationClass(){try{//去栈中找哪个类有main方法。有main方法的就是主程序。有很多主要程序。只需使用main方法找到第一个。StackTraceElement[]stackTrace=newRuntimeException().getStackTrace();对于(StackTraceElementstackTraceElement:stackTrace){if("main".equals(stackTraceElement.getMethodName())){returnClass.forName(stackTraceElement.getClassName());}}}catch(ClassNotFoundExceptionex){//吞下去继续}returnnull;}创建一个SpringApplication摘要来保存一些信息。判断当前应用的类型。Servlet或响应式编程bootstrappers:初始bootstrapper(List):去spring.factories文件中找到org.springframework.boot.Bootstrapper找到ApplicationContextInitializer;到spring.factories中找到ApplicationContextInitializer,保存在List>initializers中寻找ApplicationListener应用监听器。到spring.factories中找到ApplicationListener,保存在List>listeners中简单来说,应用创建的过程就是在spring.factories文件中放入一些关键的主键,为我们读取信息并保存到spring里面提前申请

最新推荐
猜你喜欢