# my_springboot **Repository Path**: riovo/my_springboot ## Basic Information - **Project Name**: my_springboot - **Description**: 阶段一模块四作业 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-04-06 - **Last Updated**: 2024-02-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### 介绍 阶段一模块四作业 #### 思路 1. 按照作业提示创建相关类和文件,对照源码 2. 创建AppConfig类,上面使用ComponentScan注解去扫描Main类所在的包下所有的组件 3. SpringApplication类里面有run方法去执行tomcat的运行,这里主要是使用ConfigurableApplicationContext的refresh方法。 ```java public void run(String[] args){ ConfigurableApplicationContext context = null; //初始化应用上下文 同时创建ioc容器 context = createApplicationContext(); //刷新应用上下文的环境,banner等 //springboot的准备工作基本完成 剩下的刷新主要是spring的对象初始化 context.refresh(); } private ConfigurableApplicationContext createApplicationContext(){ //默认Web服务 try { //"com.lagou.frame.web.MyServletApplicationContext" Class contextClass = Class.forName(DEFAULT_SERVLET_WEB_CONTEXT_CLASS); return (ConfigurableApplicationContext) BeanUtils.instantiateClass(contextClass); } catch (ClassNotFoundException e){ throw new IllegalStateException("无法创建默认的ApplicationContext,请指定一个ApplicationContext类",e); } catch (Exception e) { throw new RuntimeException("构建应用上下文失败",e); } } ``` 4. 当实现了Servlet3.0规范的容器(比如Tomcat7及以上版本)启动时,会通过SPI扩展机制自动扫描所有jar包里META-INF/services/javax.servlet.ServletContainerInitializer文件中指定的全路径类(该类需实现ServletContainerInitializer接口),并实例化该类,并回调类中的onStartup方法。并且Servlet 3.0+容器启动时将自动扫描类路径以查找实现Spring的Webapplicationinitializer接口的所有实现,将其放进一个Set集合中,提供给ServletContainerInitializer中onStartup方法的第一个参数。所以这里要去遍历这些集合,并且判断集合中的类不是接口不是抽象类且是WebApplicationInitializer这个子类的实现,然后将符合条件的类变成实例装进新的集合中,后面去调用该集合中对象的onStartup方法,去初始化容器和servlet。 ```java public void onStartup(Set> webAppInitClasses, ServletContext servletContext) throws ServletException { ArrayList objects = new ArrayList(); if(webAppInitClasses != null){ for (Class webAppInitClass : webAppInitClasses) { if(!webAppInitClass.isInterface()&&!Modifier.isAbstract(webAppInitClass.getModifiers())&& WebApplicationInitializer.class.isAssignableFrom(webAppInitClass)){ try{ objects.add((WebApplicationInitializer) webAppInitClass.newInstance()); }catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } } if(!CollectionUtils.isEmpty(objects)){ for (WebApplicationInitializer object : objects) { object.onStartup(servletContext); } } } ```