厦门大型网站设计公司,网站开发可选的方案有,野望王绩,python网站开发优缺点Spring Boot Spring Boot 基于 Spring 开发#xff0c;Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能#xff0c;只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。也就是说#xff0c;它并不是用来替代 Spring 的解决方案#xff0c;而是和 Spr…Spring Boot Spring Boot 基于 Spring 开发Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。也就是说它并不是用来替代 Spring 的解决方案而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具。Spring Boot 以约定大于配置的核心思想默认帮我们进行了很多设置多数 Spring Boot 应用只需要很少的 Spring 配置。同时它集成了大量常用的第三方库配置例如 Redis、MongoDB、Jpa、RabbitMQ、Quartz 等等Spring Boot 应用中这些第三方库几乎可以零配置的开箱即用。 简单来说就是SpringBoot其实不是什么新的框架它默认配置了很多框架的使用方式就像maven整合了所有的jar包spring boot整合了所有的框架 。
1.1.Spring Boot 优点
为所有Spring开发者更快的入门 开箱即用提供各种默认配置来简化项目配置 内嵌式容器简化Web项目 没有冗余代码生成和XML配置的要求
SpringBoot 运行原理
pom.xml spring-boot-dependencies: 核心依赖在父工程中 springboot-boot-starter-xxx就是spring-boot的场景启动器 spring-boot-starter-web帮我们导入了web模块正常运行所依赖的组件 SpringBoot将所有的功能场景都抽取出来做成一个个的starter 启动器只需要在项目中引入这些starter即可所有相关的依赖都会导入进来 我们要用什么功能就导入什么样的场景启动器即可 我们未来也可以自己自定义 starter 主启动类的配置
//SpringBootApplication 来标注一个主程序类
//说明这是一个Spring Boot应用
SpringBootApplication
public class SpringbootApplication {public static void main(String[] args) {//以为是启动了一个方法没想到启动了一个服务SpringApplication.run(SpringbootApplication.class, args);}
}
SpringBootApplication 作用 标注在某个类上说明这个类是SpringBoot的主配置类 SpringBoot就应该运行这个类的main方法来启动SpringBoot应用 进入这个注解可以看到上面还有很多其他注解 SpringBootConfiguration
EnableAutoConfiguration
ComponentScan(excludeFilters {Filter(type FilterType.CUSTOM,classes {TypeExcludeFilter.class}
), Filter(type FilterType.CUSTOM,classes {AutoConfigurationExcludeFilter.class}
)}
)
public interface SpringBootApplication {// ......
}
ComponentScan 这个注解在Spring中很重要 ,它对应XML配置中的元素。 作用自动扫描并加载符合条件的组件或者bean 将这个bean定义加载到IOC容器中 SpringBootConfiguration 作用SpringBoot的配置类 标注在某个类上 表示这是一个SpringBoot的配置类 // 点进去得到下面的 Component
Configuration
public interface SpringBootConfiguration {}Component
public interface Configuration {}
Configuration 说明这是一个配置类 配置类就是对应Spring的xml 配置文件 Component 这就说明启动类本身也是Spring中的一个组件而已负责启动应用 EnableAutoConfiguration 开启自动配置功能告诉SpringBoot开启自动配置功能这样自动配置才能生效 以前我们需要自己配置的东西而现在SpringBoot可以自动帮我们配置 AutoConfigurationPackage 作用 自动配置包 Import({Registrar.class})
public interface AutoConfigurationPackage {
}import Spring底层注解import 给容器中导入一个组件 Registrar.class 作用将主启动类的所在包及包下面所有子包里面的所有组件扫描到Spring容器 这个分析完了退到上一步继续看 Import({AutoConfigurationImportSelector.class}) 给容器导入组件 AutoConfigurationImportSelector 自动配置导入选择器 获取META-INF / spring.factories 总结 SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值 将这些值作为自动配置类导入容器自动配置类就生效帮我们进行自动配置工作 整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中 它会给容器中导入非常多的自动配置类 xxxAutoConfiguration, 就是给容器中导入这个场景需要的所有组件并配置好这些组件 有了自动配置类免去了我们手动编写配置注入功能组件等的工作 主启动类的运行
SpringApplication 类 最初以为就是运行了一个main方法没想到却开启了一个服务
SpringBootApplication
public class SpringbootApplication {public static void main(String[] args) {SpringApplication.run(SpringbootApplication.class, args);}
}
分析该方法主要分两部分一部分是SpringApplication的实例化二是run方法的执行
SpringApplication 这个类主要做了以下四件事情 1、推断应用的类型是普通的项目还是Web项目 2、查找并加载所有可用初始化器 设置到initializers属性中 3、找出所有的应用程序监听器设置到listeners属性中 4、推断并设置main方法的定义类找到运行的主类 查看构造器
public SpringApplication(ResourceLoader resourceLoader, Class... primarySources) {// ......this.webApplicationType WebApplicationType.deduceFromClasspath();this.setInitializers(this.getSpringFactoriesInstances();this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));this.mainApplicationClass this.deduceMainApplicationClass();
}
run 方法运行原理 自动配置原理
启动类上注解的作用 这个注解是springboot启动类上的一个注解是一个组合注解也就是由其他注解组合起来它的主要作用就是标记说明这个类是springboot的主配置类springboot应该运行这个类里面的main()方法来启动程序 SpringBootApplication
public class YunPiMdmServerApplication {private static final Logger LOG LoggerFactory.getLogger(YunPiMdmServerApplication.class);public static void main(String[] args) {SpringApplication.run(YunPiMdmServerApplication.class, args);LOG.info( 服务启动完毕 );} SpringBootApplication 注解主要由三个子注解组成 SpringBootConfigurationEnableAutoConfigurationComponentScan SpringBootConfiguration
这个注解包含了ConfigurationConfiguration里面又包含了一个Component注解也就是说这个注解标注在哪个类上就表示当前这个类是一个配置类而配置类也是spring容器中的组件
EnableAutoConfiguration
这个注解是开启自动配置的功能里面包含了两个注解 AutoConfigurationPackage ImportAutoConfigurationImportSelector.class AutoConfigurationPackage 包扫描 这个注解的作用说白了就是将主配置类SpringBootApplication标注的类所在包以及子包里面的所有组件扫描并加载到spring的容器中 这也就是为什么我们在利用springboot进行开发的时候无论是Controller还是Service的路径都是与主配置类同级或者次级的原因
Import(AutoConfigurationImportSelector.class)
上一个注解我们把所有组件都加载到了容器里面这个注解就是将需要自动装配的类以全类名的方式返回那是怎么找到哪些是需要自动装配的类呢 1、AutoConfigurationImportSelector这个类里面有一个方法selectImports()如下 2、在selectImport()方法里调用了一个getAutoConfigurationEntry()方法这个方法里面又调用了一个getCandidateConfigurations()方法 3、在getCandidateConfigurations()方法里面调用了loadFactoryNames()方法 4、loadFactoryNames()方法里面又调用了一个loadSpringFactories()方法 5、关键就在这个loadSpringFactories()方法里面在这个方法里它会查找所有在META-INF路径下的spring.factories文件 6、在META-INF/spring.factories这个文件里面的数据是以键值的方式存储然后解析这些文件找出以EnableAutoConfiguration为键的所有值以列表的方式返回 ComponentScan 这个注解的作用就是扫描当前包及子包的注解 springboot自动装配的流程 1、在springboot启动的时候会创建一个SpringApplication对象在对象的构造方法里面会进行一些参数的初始化工作最主要的是判断当前应用程序的类型以及设置初始化器以及监听器并在这个过程中会加载整个应用程序的spring.factories文件将文件中的内容放到缓存当中方便后续获取 2、SpringApplication对象创建完成之后会执行run()方法来完成整个应用程序的启动启动的过程中有两个最主要的方法prepareContext()和refreshContext()在这两个方法中完成了自动装配的核心功能在run()方法里还执行了一些包括上下文对象的创建打印banner图异常报告期的准备等各个准备工作方便后续进行调用 3、在prepareContext()中主要完成的是对上下文对象的初始化操作包括属性的设置比如设置环境变量。在整个过程中有一个load()方法它主要是完成一件事那就是将启动类作为一个beanDefinition注册到registry方便后续在进行BeanFactoryPostProcessor调用执行的时候可以找到对应执行的主类来完成对SpringBootApplication、EnableAutoConfiguration等注解的解析工作 4、在refreshContext()方法中会进行整个容器的刷新过程会调用spring中的refresh()方法refresh()方法中有13个非常关键的方法来完成整个应用程序的启动。而在自动装配过程中会调用的关键的一个方法就是invokeBeanFactoryPostProcessors()方法在这个方法中主要是对ConfigurationClassPostProcessor类的处理这个类是BFPPBeanFactoryPostProcessor的子类因为实现了BDRPPBeanDefinitionRegistryPostProcessor接口在调用的时候会先调用BDRPP中的postProcessBeanDefinitionRegistry()方法然后再调用BFPP中的postProcessBeanFactory()方法在执行postProcessBeanDefinitionRegistry()方法的时候会解析处理各种的注解包含PropertySource、ComponentScan、Bean、Import等注解最主要的是对Import注解的解析 5、在解析Import注解的时候会有一个getImport()方法从主类开始递归解析注解把所有包含Import的注解都解析到然后在processImport()方法中对import的类进行分类例如AutoConfigurationImportSelect归属于ImportSelect的子类在后续的过程中会调用DeferredImportSelectorHandler类里面的process方法来完成整个EnableAutoConfiguration的加载 主要工作流程