springboot的依赖管理和自动配置

依赖管理

根据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项目

@RestController
public class HelloController {
    
    
    @RequestMapping("/hello")
    public String handle01(){
    
    
        return "Hello SpringBoot";
    }
}

我们可以看见,可以的访问我们的请求路径。
在这里插入图片描述

就例如spring-boot-starter-web里有webmvc,在以往学习mvc时会需要有一堆的配置,例如dispatcherServlet,乱码的配置,文件上传,视图解析器等等。那么虽然依赖导入了,但是配置我们却还没有配置,应用程序也能正常工作。
我们可以在springboot的主程序入口查看对应的IOC容器。

@SpringBootApplication
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);
        }
    }
}

在启动项目的时候,会罗列出IOC容器里的组件名称 (组件过多,就不一一罗列)
在这里插入图片描述
在学习Spring时,会有包扫描的配置,可是我们在springboot里并没有配置,让springboot去扫描哪些包下的组件,那又是如何进容器的?
springboot会自动扫描主程序所在的包及其子包,都会被扫描进容器。
若是你的组件不按照springboot的默认规则来进行存放,但也想进行容器里有以下两种方式

@SpringBootApplication(scanBasePackages = "com")

或者

@ComponentScan(basePackages = "com")

在springboot项目里我们可以通过properties或者yaml文件来配置项目的一些属性,那么这些属性值又是如何生效的呢?
其实在配置文件里的值,他都是绑定到对应容器里的组件,就例如server.port

server.port=8080

ctrl+左,我们进入可以发现它对应的绑定了ServerProperties这个类

public void setPort(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里,你导入哪些场景,对应的配置就会生效。

猜你喜欢

转载自blog.csdn.net/weixin_45690465/article/details/120254533