根据springboot官方文档建立一个springboot项目
我们导入父工程
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.4</version></parent>
然后再导入对应的web场景的starter
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
我们就可以使用web场景的一些常见的依赖。
我们进入当前项目的父工程里发现里面还继承了spring-boot-dependencies。里面定义了所有场景对应的依赖及其版本号。
我们如果在导入依赖的时候,若是springboot的父项目里已经定义了我们需要导入的依赖,我们可以不需要定义version,springboot会自动帮我们导入默认的版本号,这称为版本仲裁。
那么如果我们需要自定义版本号又该如何定义呢?
例如导入mysql.connector
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>
springboot会自动仲裁版本为8.0.26
如需要自定义版本,则再自己的maven工程里加入
<properties><mysql.version>5.1.47</mysql.version></properties>
这样就会将版本改为5.1.47。
首先,我们需要查看spring-boot-dependencies里规定的依赖版本,找到其用的key,在当前项目里重写配置就行。在maven里遵循就近优先原则。
关于场景启动器,springboot的start命名规范spring-boot-starter-*, * 代表了各种对应的开发场景。
springboot所有支持的场景点击此处进行查看 。
也有许多第三方会去做springboot的场景启动器 *-spring-boot-starter。
如果你需要的依赖不在springboot的场景启动器提供的依赖里,则需要手动添加依赖并声明version。
在我们导入场景启动器后,会有大量的依赖导入到工程里。例如,我们导入web场景的启动器。写一个简单的Controller,启动springboot项目
@RestControllerpublicclassHelloController{@RequestMapping("/hello")publicStringhandle01(){return"Hello SpringBoot";}}
我们可以看见,可以的访问我们的请求路径。
就例如spring-boot-starter-web里有webmvc,在以往学习mvc时会需要有一堆的配置,例如dispatcherServlet,乱码的配置,文件上传,视图解析器等等。那么虽然依赖导入了,但是配置我们却还没有配置,应用程序也能正常工作。
我们可以在springboot的主程序入口查看对应的IOC容器。
@SpringBootApplicationpublicclassMainApplication{publicstaticvoidmain(String[] args){// 1.返回IOC容器ConfigurableApplicationContext run=SpringApplication.run(MainApplication.class, args);// 2.查看容器里的组件String[] names= run.getBeanDefinitionNames();for(String name: names){System.out.println(name);}}}
在启动项目的时候,会罗列出IOC容器里的组件名称 (组件过多,就不一一罗列)
在学习Spring时,会有包扫描的配置,可是我们在springboot里并没有配置,让springboot去扫描哪些包下的组件,那又是如何进容器的?
springboot会自动扫描主程序所在的包及其子包,都会被扫描进容器。
若是你的组件不按照springboot的默认规则来进行存放,但也想进行容器里有以下两种方式
@SpringBootApplication(scanBasePackages="com")
或者
@ComponentScan(basePackages="com")
在springboot项目里我们可以通过properties或者yaml文件来配置项目的一些属性,那么这些属性值又是如何生效的呢?
其实在配置文件里的值,他都是绑定到对应容器里的组件,就例如server.port
server.port=8080
ctrl+左,我们进入可以发现它对应的绑定了ServerProperties这个类
publicvoidsetPort(Integer port){this.port= port;}
而这个类在springboot启动的时候会被扫描进容器里
这样我们的配置文件就会生效。
按需加载所有自动配置项
spring-boot-dependencies,里有非常多的依赖版本,我们不可能是全部导入到项目中来,按需加载就是按照你导入的场景,会自动导入对应场景的依赖,例如你导入web场景,他就不会给你导入数据场景的依赖。
关于自动配置,Springboot的自动配置都在spring-boot-autoConfigure里,你导入哪些场景,对应的配置就会生效。
例如我们进入batch下查看对应的类,会发现,它有许多类是爆红的
这是因为我们没有导入对应的batch的starter,我们尝试去导入对应的batch的starter
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-batch</artifactId></dependency>
再来查看刚刚的类
对应的类就不再爆红。
关于自动配置,Springboot的自动配置都在spring-boot-autoConfigure里,你导入哪些场景,对应的配置就会生效。