在上面的实列中我们看到我们引入一个父类的依赖。
再Maven中引入一个父依赖将会进行一个依赖的版本管理。这就是为什么我们的Spring很多started都没有版本号的原因。
当我们不想去引入父类依赖的时候,(因为父类也是只有一个的)
可以去选择引入依赖
依赖管理Started启动器他的父项目 org.springframework.boot spring-boot-starter-parent2.3.4.RELEASE 几乎声明了所有开发中常用的依赖的版本号,自动版本仲裁机制 org.springframework.boot spring-boot-dependencies2.3.4.RELEASE
1、见到很多 spring-boot-starter-* : *就某种场景 2、只要引入starter,这个场景的所有常规需要的依赖我们都自动引入 3、SpringBoot所有支持的场景 https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter 4、见到的 *-spring-boot-starter: 第三方为我们提供的简化开发的场景启动器。 5、所有场景启动器最底层的依赖org.springframework.boot spring-boot-starter2.3.4.RELEASE compile
- 无需关注版本号
- 可以自定义直接修改版本号
我们再搭建SpringBoot的时候知道
SpringBoot自动配置了哪些通过再启动类中进行获取Bean组件可以看到自动装配了哪些
//这里表示SpringBoot的主程序 //起到了自动配置和打开服务器的功能 @SpringBootApplication public class SpringBootMain { public static void main(String[] args) { ConfigurableApplicationContext run = SpringApplication.run(SpringBootMain.class, args); //获取SpringBoot添加的组件 所谓组件就是一个一个的类对象 // 将对象放入SpringBoot的容器中 String[] beanDefinitionNames = run.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { System.out.println(beanDefinitionName); } } }
组件实在太多,可以看到视图解析器等
自动配置好了Tomcat
org.springframework.boot spring-boot-starter-tomcat2.3.4.RELEASE compile
自动配置好了SpringMVC
默认的包结构
进项包的扫描 *** 作。默认扫描主函数的同级及子级
可以通过注解进行改变
@SpringBootApplication(scanbasePackages="com.atguigu") 或者@ComponentScan 指定扫描路径
各个组件都存在默认值,比如端口号
组件添加的规则可以知道SpringBoot的内部自动添加了多个组件,但是组件也是由添加的条件的。
Spring中自己添加一个组件 XML配置很繁琐
注解配置注解配置也是结合XML进行扫描包来进行配置的
@Componet() @Service() @Repository() @Controller()Spring配置类
再SpringBoot中,我们添加一个组件,当然不需要再使用注解和XML方式。
而是直接使用配置类来代替SpringXML配置。
@Configuration和@Bean通过该注解可以代替简单的SpringXML配置
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件 public class MyConfig { @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"); } }@import注解
* 4、@import({User.class, DBHelper.class}) * 给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名 * * * */ @import({User.class, DBHelper.class}) @Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件 public class MyConfig { }@Conditional
条件装配注解,表示配置类中的组件必须满足条件才能注入到Spring容器中
这个注解再SpringBoot源码中可以经常看到。某个组件是否被添加到容器中
CTRL+H可以进项查看注解详细信息
该组件下的子注解
将Spirng配置文件进行导入到SpringBoot中
@importResource("classpath:beans.xml") public class MyConfig {}ConfigurationProperties
将SpringBoot的配置文件值对应实体类中进行赋值 *** 作
@Component @ConfigurationProperties(prefix = "mycar") public class Car {
@Configuration() @EnableConfigurationProperties(Car.class) //1、开启Car配置绑定功能 //2、把这个Car这个组件自动注册到容器中 public class MyConfig { }自动配置原理
下面开始重点介绍自动配置的原理,分析@SpringBootApplication注解
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication{}@SpringBootConfiguration
底层显示
表示主函数是一个Spring的配置类
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @documented @Configuration public @interface SpringBootConfiguration {@ComponetScan()
主要功能:指定扫描哪些Spring注解
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @documented @Repeatable(ComponentScans.class) public @interface ComponentScan {@EnableAutoConfiguration
@AutoConfigurationPackage @import(AutoConfigurationimportSelector.class) public @interface EnableAutoConfiguration {}@AutoConfigurationPackage
自动配置包?指定默认的包规则
将主程序下同级或子级的包中组件进行导入
@import(AutoConfigurationPackages.Registrar.class) //给容器中导入一个组件 public @interface AutoConfigurationPackage {} //利用Registrar给容器中导入一系列组件 //将指定的一个包下的所有组件导入进来?MainApplication 所在包下。@import(AutoConfigurationimportSelector.class)
导入jar包中的文件指定的组件
1、利用getAutoConfigurationEntry(annotationmetadata);给容器中批量导入一些组件 2、调用Listconfigurations = getCandidateConfigurations(annotationmetadata, attributes)获取到所有需要导入到容器中的配置类 3、利用工厂加载 Map > loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件 4、从meta-INF/spring.factories位置来加载一个文件。 默认扫描我们当前系统里面所有meta-INF/spring.factories位置的文件 spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有meta-INF/spring.factories
当然这些所有的组件并不是全部都注入,而是根据@Conditional进行规则的匹配
查看哪些生效#展示开启哪些自动配置类 debug: true
运行主程序会给出显示
.factories位置来加载一个文件。
默认扫描我们当前系统里面所有meta-INF/spring.factories位置的文件
spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有meta-INF/spring.factories
[外链图片转存中...(img-17nJae5m-1639208249140)] [外链图片转存中...(img-ZBpEKhzx-1639208249141)] 当然这些所有的组件并不是全部都注入,而是根据@Conditional进行规则的匹配 ### 查看哪些生效 ```yaml #展示开启哪些自动配置类 debug: true
运行主程序会给出显示
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)