springboot优点
- 创建独立的spring应用
- 内置web服务器
- 自动starter依赖,简化构建配置
- 自动配置spring以及第三方功能
- 提供生产级别的监控、健康检查及外部化配置
- 无代码生成、无需编写xml
spring boot包管理
- parent
之所以有些引入不需要写版本号是因为在parent中已经申明了它默认的版本号,如果需要修改这个版本则直接在我们自己的pom文件中配置即可。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.13</version>
</parent>
点击spring-boot-starter-parent进入父pom
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.4.13</version>
</parent>
继续点击spring-boot-dependencies
这里定义了很多依赖的版本,所以我们在子依赖中可以不用书写版本号,它读取的是这里的版本号。
如果我们需要使用自己的版本:
<properties>
<mysql.version>5.1.43</mysql.version>
</properties>
总结一下就是:parent中查看这个包对应的配置名称,在自己的pom文件中重写定义就会覆盖它自己的那个版本,如果底层没有配置的依赖需要在自己的pom中配置。
- starter(场景启动器)
它会将这个场景下需要的常规依赖自动导入,也可以定义自己的starter。官方不建议以spring-boot开头,建议命名方式*-spring-boot。
自动配置
基于starter去配置,里面又会包含各种starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- 自动配置好Tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.3.7.RELEASE</version>
<scope>compile</scope>
</dependency>
- 自动配置springMVC常用功能(如字符集、拦截器、视图解析器等)
ConfigurableApplicationContext run = SpringApplication.run(SpringbootdemoApplication.class, args);
String names[] = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
我们可以将IOC容器中的所有组件进行打印,发现springboot默认加载了我常用的mvc组件。
- 默认的包结构
主程序所在的包和它的子包都可以被扫描到
如果位于主程序包的外面则扫描不到改包,例如下面的例子
访问结果:
这个controller是不会注册的,因为springboot没有发现它的存在,如果想要注册需要自定义包扫描。
解决方法:
解决的时候一定要主要要是改变了扫描路径很可能引起其它的bean在装配的时候找不到。 - 法一
- 法二
由于@SpringBootApplication包含了ComponentScan注解我们也可以这样写:
- 各种配置永远默认值
1)默认配置都是映射到某一个类上的
2)配置文件的值最终会绑定到某个类 - 按需加载所有的自动配置
1)非常多的starter
2)引入了哪些场景的自动配置才会开启
3)springboot所有的配置功能都在springboot
spring-boot-starter-web ->spring-boot-starter会找到自动配置的这个依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.3.7.RELEASE</version>
<scope>compile</scope>
</dependency>
自动配置原理:
自动配置原理
常用注解
- @Configuration
配置类,它本身也是一个组件,我们可以再这个类用@bean的方式注册组件,这些组件默认是单例的。
@Configuration(proxyBeanMethods = true)
如果配置为TRUE则会检查容器中是否存在,有则不创建,保证单例。
@Configuration(proxyBeanMethods = false)
如果配置为FALSE则每次调用注册组件的函数都会产生一个新的对象。
最佳实战:
配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断(就是配置为FALSE)
配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式(就是配置为TRUE) - @@Import({User.class, Person.class})
给容器中自动创建导入类的对象(即创建某个组件) - @Conditional(),下面有多个子注解
存在某个组件、缺少某个类等判断条件进行装配
条件装配:
-@ImportResource(“classpath:beans.xml”)
在某个配置类上导入以xml配置的组件
配置绑定
@Component 需要先注册这个组件,才能够使用spring提供的配置绑定
@ConfigurationProperties(prefix = “user”)
在application.properties中写配置的值
user.name=zs
user.sex=nan
@Configuration
@EnableConfigurationProperties(User.class)
这个时候User类上还是要写@ConfigurationProperties(prefix = “user”)
特别重要
只是在配置类上可以将User这个组件注册到容器中,这样的好处是在引用第三方包的时候(我们需要将某一个类注册到容器中并绑配置,原始的类无法加Component注解,我们可以采用这种方式来讲第三方组件注册到容器总)
查看自动配置报告
debug=true negative(不生效) positive(生效)
如何修改配置文件
- 方式一
参考:https://docs.spring.io/spring-boot/docs/2.3.7.RELEASE/reference/html/appendix-application-properties.html#common-application-properties
各个配置的含义都在这里能够找到。