2、了解自动配置原理

父项目做依赖管理

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,要写版本号

自动配置

  • 自动配好 tomcatspringmvc,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 {
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值