SpringBoot解析

1:简介

(目的:简化,敏捷开发)

copy:

       当所有的人认为 Spring 不在前进的时候,Spring 推出了微架构实现的两个重要开发框架:SpringBoot、SpringCloud。

  如果要想在 Spring 之中整合 RabbitMQ、Kafka、ActiveMQ、MySQL、 Druid、Redis、Shiro,需要编写一堆堆的*.xml 配置文件; 所以在这样的一个大的历史背景下,很多人开始寻求更加简便的开发,而遗憾的是这种简便的开发没有被 JDK 所支持、没有 被 JavaEE 所支持,因为这些只是平台,平台能够提供的只是最原始的技术支持。这一时刻终于由于 Spring 框架的升级而得到了新 生,SpringBoot 的出现,改变了所有 Java 开发的困境,SpringBoot 的最终奉行的宗旨:废除掉所有复杂的开发,废除掉所有的配置文件,让开发变得更简单纯粹,核心:“零配置”。

棒棒哒!!!

2:特性

1.快速创建项目。(简化配置)

2.容器内嵌,独立运行。

3.提供约定的starter POM来简化Maven配置。

4.基本可以完全不使用xml配置文件,采用注解配置。

5.自动配置。(事务/spring/springmvc)

6:Actuator。(Actuator则要提供在运行时检视应用程序内部情况的能力。安装了Actuator就能窥探应用程序的内部情况了)

3:包

Spring应用程序起步依赖

名称  描述
spring-boot-starter 核心依赖,包括auto-configuration , logging和YAML。
spring-boot-starter-activemq 支持Apache ActiveMQ启动JMS消息。
spring-boot-starter-amqp   支持Spring AMQP与Rabbit MQ组件。
spring-boot-starter-aop  支持Spring AOP、AspectJ组件。
spring-boot-starter-artemis 支持Apache Artemis嵌入式消息服务。
spring-boot-starter-batch 支持Spring Batch,一款面向Spring的批处理框架。
spring-boot-starter-cache   支持spring的缓存技术。
spring-boot-starter-cloud-connectors 支持SpringCloud连接器。
spring-boot-starter-data-jpa 支持Hibernate的Spring JPA。
spring-boot-starter-data-mongodb 支持mongodb。
spring-boot-starter-data-redis 支持redis缓存。
spring-boot-starter-data-solr  支持solr,一款比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化的框架。
spring-boot-starter-jdbc 支持jdbc连接。
spring-boot-starter-jersey  使用JAX-RS和Jersey构建RESTful web应用程序的入门框架。
spring-boot-starter-json  支持json数据的读写操作。

SpringBoot容器依赖

名称 描述
spring-boot-starter-jetty 使用Jetty作为嵌入式servlet容器。
spring-boot-starter-reactor-nett 使用reactor netty作为嵌入式反应性HTTP服务器。
spring-boot-starter-tomcat 使用tomcat作为嵌入式servlet容器。
spring-boot-starter-undertow 使用undertow作为嵌入式servlet容器。

在实际开发过程中我们可以到dependencies依赖里面去拷贝出,需要的场景启动器,然后去掉版本好即可;

如果dependencies中的一些引用不想使用默认的版本,可以直接加上version信息,把默认的覆盖掉;

runtime

知识延伸:

scope的分类

compile
默认就是compile,什么都不配置也就是意味着compile。compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。

test
scope为test表示依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。比较典型的如junit。

runntime
runntime表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过编译而已,说实话在终端的项目(非开源,企业内部系统)中,和compile区别不是很大。比较常见的如JSR×××的实现,对应的API jar是compile的,具体实现是runtime的,compile只需要知道接口就足够了。oracle jdbc驱动架包就是一个很好的例子,一般scope为runntime。另外runntime的依赖通常和optional搭配使用,optional为true。我可以用A实现,也可以用B实现。

provided
provided意味着打包的时候可以不用包进去,别的设施(Web Container)会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是在打包阶段做了exclude的动作。

system
从参与度来说,也provided相同,不过被依赖项不会从maven仓库抓,而是从本地文件系统拿,一定需要配合systemPath属性使用。

4:配置文件

application.properties  和 application.yml 区别?

(1)结构

yml文件,树状结构。

注意点:

1,原有的key,例如spring.jpa.properties.hibernate.dialect,按“.”分割,都变成树状的配置

2,key后面的冒号,后面一定要跟一个空格

3,把原有的application.properties删掉。然后一定要执行一下  maven -X clean install

对比:看项目?

(2)优先级

 src/main/resources/config下application.properties覆盖src/main/resources下application.properties中相同的属性

 application.yml 先加载,application.properties后加载(后者覆盖前者,因此后者优先级高)

(3)我们在使用中经常会根据不同的环境根据spring.profiles.active属性来定义不同的配置文件:

  • application-dev.properties
  • application-test.properties
  • application-prod.properties

5:启动过程

SpringBoot解析_第1张图片

(1)new SpringApplication:

setInitializers:设置的时候会先new,也就是说这方法每次都是整体更换,不会追加。这个方法的参数都是各个模块中配置在META-INF/spring.factories中的key为org.springframework.context.ApplicationContextInitializer的值,这些类都是接口ApplicationContextInitializer的泛型实现。

setListeners:同上

mainApplicationClass:在deduceMainApplicationClass方法中,通过获取当前调用栈,找到入口方法main所在的类,并将其复制给SpringApplication对象的成员变量mainApplicationClass。在我们的例子中mainApplicationClass即项目中Application类。

(2)run():

StopWatch:秒表,非线程安全

configureHeadlessProperty():System.setProperty("java.awt.headless","true")即使没有检测到显示器,也允许其启动

listeners.starting():

prepareEnvironment: 先是读取了应用的启动参数和profile配置,configurePropertySources来配置properties,然后调用  configureProfiles来配置profiles然后用listeners.environmentPrepared(environment)传给监听器

configureIgnoreBeanInfo:#跳过搜索BeanInfo类spring.beaninfo.ignore

createApplicationContext:通过扫描所有注解类来加载bean,最后通过BeanUtils实例化上下文对象

prepareContext:将listeners、environment、applicationArguments、banner等重要组件与上下文对象关联

refreshContext(context):是实现spring-boot-starter-*(mybatis、redis等)自动化配置的关键,包括spring.factories的加载,bean的实例化等核心工作,注册可以解析的自动装配

6:注解

@SpringBootApplication:

@RestController:
用于标注控制层组件(如struts中的action),包含@Controller和@ResponseBody。

@ComponentScan:
组件扫描。个人理解相当于,如果扫描到有@Component @Controller @Service等这些注解的类,则把这些类注册为bean。

@Configuration:
指出该类是 Bean 配置的信息源,相当于XML中的,一般加在主类上。

@Bean:
相当于XML中的,放在方法的上面,而不是类,意思是产生一个bean,并交给spring管理。

@EnableAutoConfiguration:
让 Spring Boot 根据应用所声明的依赖来对 Spring 框架进行自动配置,一般加在主类上

你可能感兴趣的:(Java)