SpringBoot是如何启动的?

Spring Boot 启动SpringBoot的启动类很简单,只需要调用SpringApplication的run方法即可,这篇文章来分析一下SpringBoot的启动类SpringApplication初始化的过程。 123public static void main(String[] args) { SpringApplication.run(Application.class, args); } 在SpingApplication 中 初始化了一个SpringApplication, 参数是当前SpringBoot启动的类 123public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) { return new SpringApplication(primarySources).run(args); } SpringApplication初始化 从classpath推断 webApplicationType 设置Initializers 设置Listeners 推断main class,主要用于log print以及banner print 123456789public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { this.resourceLoader = resourceLoader; Assert.notNull(primarySources, "PrimarySources must not be null"); this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources)); this.webApplicationType = WebApplicationType.deduceFromClasspath(); setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class)); setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); this.mainApplicationClass = deduceMainApplicationClass(); }

源码解析

Spring是如何加载BeanDefinition的?

Spring Bean生命周期中,BeanDefinition是最重要的部分,在初始化和实例化Bean之前,首先要把所有的需要Spring管理的Bean对应的BeanDefinition加载到Spring容器中,这一步非常关键,因为BeanDefinition是Bean关联的元数据,这一篇文章就以AnnotationConfigApplicationContext来分析一下Spring容器是如何加载BeanDefinition的。 第一阶段:扫描Class文件加载BeanDefinition123456public AnnotationConfigApplicationContext(String... basePackages) { this(); scan(basePackages); refresh(); } 我们先以package的方式来分析,初始化AnnotationConfigApplicationContext的时候会scan对应的包路径,然后进行refresh scan的动作是在ClassPathBeanDefinitionScanner的doScan方法中完成的,主要任务是查找classpath下面的Class文件,判断是否为Bean,然后生成BeanDefinition。

源码解析

Spring Environment体系分析

Spring Environment 体系 Environment Interface representing the environment in which the current application is running. Models two key aspects of the application environment: profiles and properties. Methods related to property access are exposed via the PropertyResolver superinterface. Environment 继承自PropertyResolver 定义了应用运行环境的两大关键要素: profiles 和properties,其中properties接口通过父类的PropertyResolver 暴露接口.

源码解析

Spring MVC源码探究

作为一名合格的java程序员,要多深入学习一些框架,理解框架的设计的方法,背后的原理,spring mvc框架中使用了很多设计模式,比如策略模式,Spring MVC中大量使用了策略模式,像HandlerMapping接口,HandlerAdapter接口,ViewResolver接口都使用了策略模式,在执行handler和Interceptor拦截器的时候使用了责任链模式,在执行handler的时候会用到适配器模式等等,可以说沉淀了很多前辈的精华,想成为架构师的话,学习源码必不可少,下面就围绕着Spring MVC 的前端控制器DispatcherServlet一步一步的来学习Spring MVC的源码。 1 web.xml中DispatcherServlet的配置web.xml中的Spring MVC的前端控制器DispatcherServlet的配置,所有后端Controller的请求都由这个DispatcherServlet分发。 123456789101112<servlet> <servlet-name>MySpringServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/spring-mvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>MySpringServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>

spring框架

使用Spring boot 创建RestFul服务

准备工作1.JDK82.Maven 3.0+ 程序要实现的简单功能当用户访问 http://localhost:8080/greeting 返回一个默认的Json字符串 {"id":1,"content":"Hello, World!"} 当用户访问 http://localhost:8080/greeting?name=User 返回 name后面的参数在后台组成的字符串 {"id":1,"content":"Hello, User!"} 创建Maven项目创建一个普通的maven项目,添加maven依赖如下:

spring框架

Spring MVC 数据类型绑定

今天遇到一个问题,使用Spring MVC 从页面传递一个用户List到Controller,然后再后台解析List得到多个用户对象,在网上搜了很多答案感觉都不行,后来调试代码发现,最关键在于:List需要绑定在对象(ActionForm),直接写在request-mapping函数的参数是不行的,更重要的一点是要创建对象(ArrayList)。 之前的Jsp代码是这么写的 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162<form action="insertInsureUser.do" method="post"> <div class="form_left">开始时间:</div> <div class="form_right"> <input name="insureObject.startTime"/> </div> <div class="form_left">产品代码:</div> <div class="form_right"> <input name="insureObject.productCode"/> <h2>投保人信息</h2> </div> <div class="form_left">姓名:</div> <div class="form_right"> <input name="insureObject.insureUser[0].startTime"/> </div> <div class="form_left">身份证号:</div> <div class="form_right"> <input name="insureObject.insureUser[0].idCard"/> </div> <div class="form_left">性别:</div> <div class="form_right"> <input name="insureObject.insureUser[0].sex"/> </div> <div class="form_left">地址:</div> <div class="form_right"> <input name="insureObject.insureUser[0].address"/> </div> <div class="form_left">邮箱:</div> <div class="form_right"> <input name="insureObject.insureUser[0].email"/> </div> <div class="form_left">电话号码:</div> <div class="form_right"> <input name="insureObject.insureUser[0].phone"/> </div> <h2>被保人信息</h2> </div> <div class="form_left">姓名:</div> <div class="form_right"> <input name="insureObject.insureUser[1].startTime"/> </div> <div class="form_left">身份证号:</div> <div class="form_right"> <input name="insureObject.insureUser[1].idCard"/> </div> <div class="form_left">性别:</div> <div class="form_right"> <input name="insureObject.insureUser[1].sex"/> </div> <div class="form_left">地址:</div> <div class="form_right"> <input name="insureObject.insureUser[1].address"/> </div> <div class="form_left">邮箱:</div> <div class="form_right"> <input name="insureObject.insureUser[1].email"/> </div> <div class="form_left">电话号码:</div> <div class="form_right"> <input name="insureObject.insureUser[1].phone"/> </div></form>

spring框架

本站由 Hank Zhao 使用 Stellar 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
本站总访问量