申明:本文属于整理加工原创,部分举证材料来自于网络,仅用于学习参考。
本文主要介绍SpringBoot入门相关知识,通过本文讲解,你可以明白:
1、SpringBoot的设计初衷;
2、SpringBoot的项目结构;
3、SpringBoot的工作原理;
4、SpringBoot的核心模块有哪些?
一、SpringBoot的设计初衷
1、来源
Spring Boot是由Pivotal团队提供的全新框架,目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。
2 、设计初衷
首先了解一下Spring框架特点:Spring的组件代码轻量,配置却是重量级。
Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。无需开发重量级的Enterprise JavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过控制反转IOC和面向切面编程AOP,用简单的Java对象(Plain Old Java Object,POJO)实现了EJB的功能。但是用过Spring的都知道,配置过程较为复杂,每个Bean的装配都要在xml中配置一下才能自动装入,类似于以下:
当只有少量Bean时,配置过程还不怎么复杂,但是SSM三大框架整合,还有些其它框架加入,配置过程就变得比较复杂。
Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置
Spring 3.0引入了基于Java的配置,这是一种类型安全的可重构配置方式,可以代替XML。
但是每个项目都需要进行这个繁琐但又必须的配置过程,因此急需一个工具来自动处理Spring配置过程。这就是Pivotal团队设计SpringBoot的初衷。
SpringBoot来源于Spring,又对上述Spring的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。
3、SpringBoot的特点
1)基于Spring的开发提供更快的入门体验;
2)开箱即用,没有代码生成,也无需XML配置。也支持修改默认配置;
3)提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等。
SpringBoot不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式。
二、SpringBoot的项目结构
SpringBoot主要由四层结构组成:
1、实体层(entity层/pojo层)
一般是数据库中的一张表就对应一个实体类,而类的属性值和表结构字段的属性一一进行映射。
2、数据持久层(dao层/mapper层)
dao层(Data Access Object)作用是连接和访问数据库,向数据库发送sql的语句,完成对应实体层对应数据库表的增删改查操作。通常SQL语句可以写在mapper文件里面。
3、数据库服务层(service层)
主要负责业务逻辑的设计和实现,一般是首先设计接口,然后再对接口进行实现。
4、控制层(controller层)
控制层主要负责业务模块的流程控制和分发,同时承担参数的校验。负责前后端的交互工作,接受前端的请求,并进行初步处理后分发到service层进行处理。
除此外,还有些其他相关的组成部分,例如:
工具类库utils、配置类config、数据传输对象dto、视图包装对象vo等。
其中数据传输对象Data Transfer Object用于封装多个实体类domain之间的关系,不破坏原有的实体类结构。
三、SpringBoot的工作原理
我们先来看看pom.xml文件中几个比较关键的配置
1、pom.xml文件
1)spring-boot-dependencies:核心依赖在父工程中;
2)spring-boot-starter-web:帮我们导入了web模块正常运行所依赖的组件;
SpringBoot将所有的功能场景都抽取出来,做成一个个的starter(启动器),只需要在项目中引入这些starter即可,所有相关的依赖都会导入进来,我们要用什么功能就导入什么样的场景启动器即可,我们也可以自己自定义starter。
2、启动类-注解
通过spring-boot-starter-web的配置,我们就可以通过注解@SpringBootApplication进行启动
//@SpringBootApplication 来标注一个主程序类
//说明这是一个Spring Boot应用
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
//以为是启动了一个方法,没想到启动了一个服务
SpringApplication.run(SpringbootApplication.class, args);
}
}
打开@SpringBootApplication的源码,我们可以发现@SpringBootApplication其实主要是由@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan这三个注解构成的一个组合注解。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}
1)@ComponentScan注解
@ComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。所以SpringBoot的启动类最好是放在root package下,因为默认不指定basePackages。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
}
2)@SpringBootConfiguration注解
打开的@SpringBootConfiguration源码,我们可以发现@SpringBootConfiguration其实就是一个@Configuration注解而已,它只是告诉spring这是一个配置类可以被加载到spring IOC容器中。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}
3)@EnableAutoConfiguration注解
我们来看下其源码:
@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}
这里又引入了一个注解@AutoConfigurationPackage,打开其源码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
}
我们发现这个两个注解里面都有@Import,根据名称我们大致可以猜到:
@EnableAutoConfiguration中@Import(EnableAutoConfigurationImportSelector.class)是导入“能够自动配置的导入选择器”的;
@AutoConfigurationPackage中@Import(AutoConfigurationPackages.Registrar.class)是导入“自动配置包”的。
这其中,最关键的要属@Import(EnableAutoConfigurationImportSelector.class),借助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。
综述,@EnableAutoConfiguration注解是用于自动配置的,她能够自动配置spring容器的上下文信息,能够将bean节点加载到IOC容器中。
3、启动类-运行
SpringApplication类运行了一个main方法:
该方法主要分两部分,一部分是SpringApplication的实例化,二是run方法的执行;SpringApplication 这个类主要做了以下四件事情:
1)推断应用的类型是普通的项目还是Web项目;
2)查找并加载所有可用初始化器 , 设置到initializers属性中;
3)找出所有的应用程序监听器,设置到listeners属性中;
4)推断并设置main方法的定义类,找到运行的主类。
//@SpringBootApplication 来标注一个主程序类
//说明这是一个Spring Boot应用
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
//以为是启动了一个方法,没想到启动了一个服务
SpringApplication.run(SpringbootApplication.class, args);
}
}
四、SpringBoot的核心模块有哪些?
Spring Boot有10个核心模块:
1、spring-boot
Spring Boot的主模块,也是支持其他模块的核心模块,主要包含以下几点:
1) 提供了一个启动 Spring 应用的主类,并提供了一个相当方便的静态方法,它的主要是作用是负责创建和刷新Spring容器的上下文;
2) 内嵌式的并可自由选择搭配的WEB应用容器,如:Tomcat,Jetty,Undertow等;
3) 对配置外部化的支持;
4) 提供一个很方便的Spring容器上下文初始化器,包括合理记录日志默认参数的支持。
2、spring-boot-autoconfigure
Spring Boot能根据类路径下的内容自动一些公共大型应用,提供的@EnableAutoConfiguration注解就能启用Spring功能的自动配置。
自动配置功能可以推断用户可能需要加载哪些Spring Bean,如:如果类路径下有HicariCP这个连接池的包,此时并未提供任何有效连接池的配置,那么Spring Boot就知道你可能需要一个连接池,并做相应配置。如果用户配置了其他连接池,那么Spring Boot会放弃自动配置。
3、spring-boot-starters
启动器,它包括一系列依赖的描述符。可以一站式的帮你打包Spring及相关技术应用,而不需要你到处找依赖和示例配置代码,它都帮你做好了。例如:spring-boot-starters这个启动器这主要提供了spring-boot,spring-context,spring-beans这三个Spring模块。
4、spring-boot-cli
Spring Boot的命令行工具,用于编译和运行Groovy源程序,可以十分简单的编写并运行一个应用程序。它也能监控你的文件,一旦有变动就会自动重新编译和重新启动应用程序。
5、spring-boot-actuator
Spring Boot提供的执行端点,你可以更好的监控及和你的应用程序交互。这个模块提供了像健康端点、环境端点、Spring Bean端点等。
6、spring-boot-actuator-autoconfigure
原理同上,为Spring Boot执行端点提供自动配置。
7、spring-boot-test
Spring Boot测试模块,为应用测试提供了许多非常有用的核心功能。
8、spring-boot-test-autoconfigure
原理同上,为Spring Boot测试模块提供自动配置。
9、spring-boot-loader
可以用来构建一个单独可执行的jar包,使用java -jar就能直接运行。一般不会直接使用这个来打包,使用Spring Boot提供的Maven或者Gradle插件就行了。
10、spring-boot-devtools
开发者工具模块,主要为Spring Boot开发阶段提供一些特性,如修改了代码自动重启应用等。这个模块的功能是可选的,只限于本地开发阶段,当打成整包运行时这些功能会被禁用。