统一环境配置:
IDEA 中Maven 的路径配置:
配置自己电脑上的Maven 路径
实现一个简单功能:
1.创建一个简单的Maven 工程:
后面的配置路径文件自己配置。都差不多。
2.引入Springboot 依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
3.编写主程序
4.编写相关业务逻辑
编写Controller
5.在主程序类中启动程序
访问这个项目的Controller: 发送/hello 请求
6.简化部署:
利用maven 的工具对我们项目进行打包:
然后在target 目录下找到打包好的jar 包
可以把这个jar 包弄到桌面,然后用java 命令对其进行运行
Tips: 先看看jar 所在的位置,右键jar 包,属性,看所在路径。
然后利用cmd 命令: cd jar 包路径
然后利用命令java -jar spring…(打到这里可以按tab 键提示全名),最后运行
运行成功:
服务器之所以打包项目运行不需要tomcat 环境,是因为利用利用maven 整合的spring-boot 插件中就已经有了tomcat 的相关配置环境了,可以到jar 包看看:
进lib 看看:
为什么引入这么少的依赖就能做到以前spring,springmvc 能做的大部分事情呢?
从pom 文件的依赖开始探究:
我们引入的父项目还依赖着如下的父项目:
而这个spring-boot-dependencies 中properties 中,定义并管理着我们后来可能要用到的依赖的版本,所以它就是Spring boot 的版本仲裁中心,以后我们导入的依赖默认是不需要写版本的(没有在denpendencies 里面管理的依赖是需要自己声明版本号的)
父项目负责管理依赖版本,那么依赖(Spring,Springmvc,tomcat)是由谁导进来的呢?
spring-boot-starter: spring-boot 场景启动器:帮我们导入了web 模块正常运行所依赖的组件。依赖的版本都受父项目进行仲裁
在spring-boot 官网中能看到,spring-boot 将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目中引入这些starter 相关场景的所有依赖都会导入进来。要用什么功能,就到导入什么场景启动器
查看@SpringBootApplication 注解:
它里面其实就是一个组合配置
点击@SpringBootConfiguration
发现它就是一个配置类
再点击@Configuration
发现配置类其实也是一个组件
点击@EnableAutoConfiguration
@AutoConfigurationPackage: 自动配置包注解。再点进去看看里面的东西
@AutoConfigurationPackage 的底层就是导入一个Registrar 组件,
点进Registrar 这个类,发现registerBeanDefinitions 这个方法里面有一个meta 参数,这个参数是原信息,用debug 看看这个方法 。发现这个注解就是作用于com.jy.HelloWorldMainApplication 类上的
我们看到有一个PackageImport 方法,我们拿来用idea 计算一下,能推出它的参数:对着这段代码 -> 右键 -> Evaluate Experssion
也就是说这个方法它能够找到主配置类所在包下的所有包都能扫描进去
所以@AutoConfigurationPackage 就能帮我们自动扫描包工作。
但是注意:如果我主配置类所在包路径:com.jy 下,但我的组件Controller 在包路径:com.Hello 下,那么这个组件是扫描不到的。
导完我们自己的组件,就要导Spring 自带的组件(这里就是简化我们不用自己导入那么组件的关键操作)
我们来看@SpringBootApplication 中的@EnableAutoConfiguration 中的底层注解
它其实就一个判断方法,所以还得看他的父类
在它父类的方法中,有一个方法返回了一个String 数组,那么当我们看到它生成了一个list 的时候,然后后面的代码一直都在用这个list 中的数据,并且还把它弄成一个String 数组然后返回了,那么就能确定,这个list 中的数据就是SpringBoot 中要导入的自带的那部分组件
从list 的数据就能看到,SpringBoot 所有需要导入的组件以全类名的方式进行返回;然后根据他们的类名路径被添加到容器中。
而这些组件都是对应组件的自动配置类:XXXAutoConfiguration,他们的作用就是给容器中导入这个场景需要的所有组件,并配置好这些组件
有了以上的自动配置类,就免去我们手动编写配置注入功能组件等工作:
那么它是从哪得到这些自动配置类的呢?
有一个方法是getCandidateConfiguration(),这个方法就是获取所有参与该项目的配置,我们点进去看看
能看到这个方法在加载类路径下的META-INF/spring.factories 文件中的值
去这个文件看看
发现里面其实已经写好了SpringBoot 要导入的所有组件的自动配置类的全类名。所以Spring Boot 就是将这些值作为组件的自动配置类导入到容器中,自动配置类就生效了,帮我们进行自动配置工作。换句话来说,其实我们需要配置的东西都没有少,只是SpringBoot 官方帮我们做了而已
SpringBoot 的autoconfigure jar包下的所有类,就是J2EE 的所有大整合.
快速创建SpringBoot 项目:
利用IDEA 提供的SpringBoot 创建向导:Spring Initializer
选择模块:之前我们是要用哪个模块的功能,就导入哪个模块的starter;这里也一样。
目前我们只用到web 模块,所以只导入它
在创建完项目以后,会有一个提示框,如果没点的话也没关系,只需要在右边框中点击刷新按钮也能达到同样效果