父项目做依赖管理
pom.xml
文件里面,父项目 spring-boot-starter-parent
包括 spring-boot-dependencies
,里面几乎声明了所有开发中常用的依赖的版本号。
自动版本仲裁数据
如果不满意,自定义修改版本
1、首先在仓库查找合适的版本号
https://mvnrepository.com/artifact/com.baomidou
2、查看spring-boot-dependencies里面规定当前依赖的版本 用的 key。
3、在 pom.xml 文件里,写
<properties><mysql.version>5.1.43</mysql.version></properties>
开发导入 starter 场景启动器
-
见到很多
spring-boot-starter-*
, *就是某种场景 -
只要引入 starter , 这个场景的所有常规需要的依赖,我们都自动引入
-
SpringBoot所有支持的场景
https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter
-
见到的
*-spring-boot-starter
,是第三方为我们提供的简化开发的启动器 -
所有场景启动器最底层的依赖都是
spring-boot-starter
-
引入依赖默认都可以不写版本号,引入非版本仲裁的 jar,要写版本号
自动配置
-
自动配好
tomcat
,springmvc
,web 常见问题,如字符编码等
SpringBoot 帮我们配置好了所有web开发的常见问题 -
默认的包结构
主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来
主程序所在的包
可以显示car
car 错误
- 解决办法:想要改变扫描路径?
1、@SpringBootApplication(scanBasePackages="com.example.springboot")
里面是引用,而非路径。
2、@ComponentScan
指定扫描路径
@SpringBootApplication =
@SpringBootConfiguration @Configuration 指定当前是一个配置类
+ @EnableAutoConfiguration
+ @ComponentScan 指定扫描哪些 Spring 注解
-
各种配置拥有默认值
默认配置最终都是映射到 MultiPartProperties
配置文件的值最终会绑定每个类上,这个类会在容器中创建对象 -
按需加载所有的自动配置项
非常多的 starter
引入了哪些场景,这个场景的自动配置才会开始
springboot 所有的自动配置功能都在spring-boot-autoconfigure
包里面
xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 ---->application.properties
容器功能——组件添加
1、创建实体类。User 和 Pet
属性私有,记得写有参和无参构造方法
2、在配置类中为容器添加组件
@Configuration // 告诉 SpringBoot 这是一个配置类 == 配置文件
public class MyConfig {
@Bean // 标注方法 @Bean :
// 给容器中添加组件,以方法名作为组件的 id,返回类型就是组件类型。返回的值,就是组件在容器中的实例。
public User user01(){
User zhangsan = new User("张三",18);
return zhangsan;
}
@Bean("tom")
public Pet pet01(){
Pet tomcat = new Pet("tomcat");
return tomcat;
}
}
3、在主函数中查看容器中拥有的组件名称。配置类本身也是组件
// 1、返回我们的IOC容器
ConfigurableApplicationContext run = SpringApplication.run(HelloWorldApplication.class, args);
// 2、查看容器里面的组件
String[] beanDefinitionNames = run.getBeanDefinitionNames();
for (String name :beanDefinitionNames){
System.out.println(name);
}
- 默认单实例
// 3、从容器中获取组件
Pet tom01 = run.getBean("tom", Pet.class);
Pet tom02 = run.getBean("tom", Pet.class);
// 在IDEA中System.out.println()的快捷键是 sout+Enter
System.out.println("组件:"+(tom01 == tom02));
//配置类不用根据组件名称查找
MyConfig myConfig = run.getBean(MyConfig.class);
Pet tom03 = myConfig.pet01();
System.out.println("组件:"+(tom01 == tom03));
都为 true ,都是一个。
- 组件依赖
@Configuration(proxyBeanMethods = false)
proxyBeanMethods:代理 bean 的方法。默认为 true 。
外部无论对配置类中的这个组件注册方法调用多次,获取的都是之前注册容器中的单实例对象。
- Full 全/单例模式,proxyBeanMethods默认是true:使用代理,也就是说该配置类会被代理,直接从IOC容器之中取得bean对象,不会创建新的对象。SpringBoot总会检查这个组件是否在容器中是否存在,保持组件的单实例
- Lite 轻量级/原型模式,proxyBeanMethods设置为false:每次调用@Bean标注的方法获取到的对象是一个新的bean对象,和之前从IOC容器中获取的不一样,SpringBoot会跳过检查这个组件是否在容器中是否存在,保持组件的多实例
实验: user 里面有 pet
Import
在 myconfig 文件上,即有组件注册的类上
@Import({User.class, DBHelper.class})
给容器中自动创建出这两个类型的组件
高级用法: https://www.bilibili.com/video/BV1gW411W7wy?p=8
Conditional
条件装配
满足Conditional 指定的条件,则进行组件注入
只有 user01 组件有的,tom组件才能有
只有user组件没有的情况,pet组件才能有。比如说备用电脑。
结果是:不存在pet
原生配置引入
@ImportResource("classpath:beans.xml")
导入 Spring 的配置文件 beans.xml
配置绑定
方式一:@Component和@ConfigurationProperties一起写在一个要绑定的java bean上
/**
* 只有在容器中的组件,才会拥有SpringBoot提供的强大功能
*/
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {
private String brand;
private Integer price;
方式二:只把@ConfigurationProperties写在一个要绑定的java bean上,然后在任意一个配置类上写注解@EnableConfigurationProperties。
@EnableConfigurationProperties(Car.class)
//1、开启Car配置绑定功能
//2、把这个Car这个组件自动注册到容器中
public class MyConfig {
}