第二章:了解自动配置原理之SpringBoot原理-基础入门

本文详细介绍了SpringBoot的特点,包括依赖管理和自动配置。在依赖管理方面,SpringBoot通过starter场景启动器自动引入所需依赖并进行版本仲裁。在自动配置方面,SpringBoot配置了Tomcat、SpringMVC等,并提供了默认配置。此外,文章还探讨了SpringBoot的容器功能,如@Configuration、@Bean等注解的使用,以及如何导入和绑定配置文件。接着,文章深入解析了SpringBoot自动配置的原理,包括如何加载配置类和按需启用配置项。最后,文章提到了开发小技巧,如Lombok、dev-tools和Spring Initializr的使用。
摘要由CSDN通过智能技术生成

目录

一.SpringBoot特点

1.1依赖管理

1.2自动配置

二.容器功能 

2.1组件添加

①@Configuration

②@Bean、@Component、@Controller、@Service、@Repository

③@ComponentScan、@Import

④@Conditional

2.2原生配置文件引入

①@ImportResource("指定类路径")

2.3配置绑定

①@ConfigurationProperties(prefix = "")

②@EnableConfigurationProperties + @ConfigurationProperties

③@Component + @ConfigurationProperties

三.自动配置原理入门

3.1引导加载自动配置类

①@SpringBootConfiguration

②@ComponentScan

③@EnableAutoConfiguration

①@AutoConfigurationPackage

②@Import(AutoConfigurationImportSelector.class)

3.2.按需开启自动配置项

3.3.修改默认配置

 3.4.最佳实践

四.开发小技巧

4.1、Lombok

4.2、dev-tools

4.3、Spring Initailizr(项目初始化向导)

①选择我们需要的开发场景

②自动依赖引入

③自动创建项目结构

④自动编写好主配置类


一.SpringBoot特点

1.1依赖管理

①父项目做依赖管理

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.5</version>
    </parent>

他的父项目

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.7.5</version>
  </parent>

 几乎声明了所有开发中常用的依赖的版本号,自动版本仲裁机制

②开发导入starter场景启动器

现在我们开发一个web应用,无需我们关心到底要导哪些包,我们只需要导入一个

1.见到很多 spring-boot-starter-* :*就代表某种场景

2.只要引入starter,这个场景的所有常规需要的依赖我们都会自动引入

3.SpringBoot所有支持的场景

Developing with Spring Boot

4.见到的 *-spring-boot-starter:第三方为我们提供的简化开发的场景启动器。

5.所有场景启动器底层的依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
  <version>2.7.5</version>
  <scope>compile</scope>
</dependency>

③无需关注版本号,自动版本仲裁

1.引入依赖默认都可以不写版本

2.引入非版本仲裁的jar,要写版本号

④可以修改版本号

1.查看spring-boot-dependencies里面规定当前依赖的版本用的key。

2.在当前项目里面重写配置

    <properties>
        <mysql.varsion>8.0.29</mysql.varsion>
    </properties>

1.2自动配置

自动配好Tomcat

  1. 引入Tomcat依赖。
  2. 配置Tomcat
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <version>2.7.5</version>
      <scope>compile</scope>
    </dependency>

自动配好SpringMVC

  1. 引入SpringMVC全套组件
  2. 自动配好SpringMVC常用组件(功能)

自动配好web常用功能,如:字符编码问题

  1. SpringBoot帮我们配置好了所有web开发的常见场景

默认的包结构

  1. 主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来
  2. 无需以前的包扫描配置
  3. 想要改变扫描路径,@SpringBootApplication(scanBasePackages="com.tian")或者              @ComponentScan指定扫描路径

@SpringBootApplication

等同于

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan("com.tian.boot")

各种配置拥有默认值

  1. 默认配置最终都是映射到MultipartProperties
  2. 配置文件的值最终会绑定每个类上,这个类会在容器中创建对象

按需加载所有自动配置项 

  1. 非常多的starter
  2. 引入了哪些场景这个场景的自动配置才会开启
  3. SpringBoot所有的自动配置功能都在 spring-boot-autoconfigure 包里面

二.容器功能 

2.1组件添加

①@Configuration

基本使用:

Full模式与Lite模式

示例

最佳实战

  • 配置 类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
  • 配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式
//#############################Configuration使用示例######################################################
/**
 * 1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的
 * 2、配置类本身也是组件
 * 3、proxyBeanMethods:代理bean的方法
 *      Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
 *      Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
 *      组件依赖必须使用Full模式默认。其他默认是否Lite模式
 *
 */
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {

    /**
     * Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
     * @return
     */
    @Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
    public User user01(){
        User zhangsan = new User("zhangsan", 18);
        //user组件依赖了Pet组件
        zhangsan.setPet(tomcatPet());
        return zhangsan;
    }

    @Bean("tom")
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}
//################################@Configuration测试代码如下########################################
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.atguigu.boot")
public class MainApplication {

    public static void main(String[] args) {
        //1、返回我们IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

        //2、查看容器里面的组件
        String[] names = run.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }

        //3、从容器中获取组件
        Pet tom01 = run.getBean("tom", Pet.class);
        Pet tom02 = run.getBean("tom", Pet.class);
        System.out.println("组件:"+(tom01 == tom02));

        //4、com.atguigu.boot.config.MyConfig$$EnhancerBySpringCGLIB$$51f1e1ca@1654a892
        MyConfig bean = run.getBean(MyConfig.class);
        System.out.println(bean);

        //如果@Configuration(proxyBeanMethods = true)代理对象调用方法。SpringBoot总会检查这个组件是否在容器中有。
        //保持组件单实例
        User user = bean.user01();
        User user1 = bean.user01();
        System.out.println(user == us
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值