0
点赞
收藏
分享

微信扫一扫

【学习笔记】SpringBoot2源码级学习

爱薇Ivy趣闻 2022-03-13 阅读 60

1、Spring与SpringBoot

2、SpringBoot入门

3、了解自动配置原理

1、SpringBoot特点

1.1、pom依赖管理

依赖管理——每个项目的pom.xml都有这么一段代码
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.3</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
它的父项目
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.6.3</version>
</parent>
几乎声明了所有开发中常用的依赖的版本号,自动版本仲裁机制,可以自己配置版本替换

配置前
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fisXu5kZ-1647133327403)(SpringBoot2.assets/image-20220311201233141.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xg4mRWvT-1647133321379)(SpringBoot2.assets/image-20220311201233141.png)]

配置后:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nTZPQfGC-1647133124152)(SpringBoot2.assets/image-20220311201155749.png)]

1.2、starter场景启动器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sLIceeYX-1647133124153)(SpringBoot2.assets/image-20220311202248830.png)]

  • 无需关注版本号,自动·版本仲裁
  • 可以修改版本号

1.3、自动配置

  • 自动配置Tomcat

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BMiGUT23-1647133124153)(SpringBoot2.assets/image-20220311203249488.png)]

  • 自动配置SpringMVC

    • 引入SpringMVC全套组件
    • 自动配好SpringMVC常用组件(功能)
  • 自动配好web常见功能

    • 字符编码问题
  • 默认的包结构

    • 包扫描配置
  • 各种配置拥有默认值

    • 默认配置最终都映射到对应配置类中
    • 配置文件的值最终会绑定到对应类上,这个类会在容器中创建对象
  • 按需加载所有自动配置项

    • 非常多的starter场景启动器
    • SpringBoot所有自动配置功能都在spring-boot-autoconfigure包里面

2、容器功能

2.1、组件添加

  • 基本使用
  • Full模式与Lite模式
    • 示例:
    • 最佳实战

1、Full与Lite实践:

proxyBeanMethods=false时,使用依赖注入IDEA会报红,但是不影响运行!!!Method annotated with @Bean is called directly in a @Configuration where proxyBeanMethods set to false. Set proxyBeanMethods to true or use dependency injection.·

译文:用@ bean注释的方法是直接调用在@ configuration proxyBeanMethods设置为false。需要proxyBeanMethods设置为true或使用依赖注入。

User类中的pet属性类型是Pet类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RW40HixB-1647133124155)(SpringBoot2.assets/image-20220311215809341.png)]

测试代码及结果:

//配置类本身也是组件
MyConfig myConfig = run.getBean(MyConfig.class);
System.out.println("配置类本身也是组件:" + myConfig);

//proxyBeanMethods=false测试依赖注入
User u3 = myConfig.user01();
Pet p31 = u3.getPet();

Pet p1 = myConfig.pet01();
//结果为false,即不是同一个,则无法实现依赖注入!!!
System.out.println("u3中的p31是否和p1相同:" + (p31 == p1));

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tm02CVUG-1647133124156)(SpringBoot2.assets/image-20220311220632928.png)]

2、@Bean、@Component、@Controller、@Service、@Repository

3、@ComponentScan、@Import

  • @ComponentScan——包扫描,定义包扫描规则
  • @Import——@Import({User.class,CloudPlatform.class}):给容器中自动创建出这两个组件,默认组件名为全限定类名!!!

4、@Conditional

条件装配:满足Conditional指定的条件,则进行组件注入

2.2、原生配置文件引入

1、@ImportResource

在任何一个配置类上导入即可:
@ImportResource("classpath:spring.xml")

2.3、属性值绑定

1、@ConfigurationProperties

#定义car对象,brand、price都为属性名
car.brand=比亚迪
car.price=19999.0
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Component //一定要将该类交给Spring容器管理,才能使用Spring功能
@ConfigurationProperties(prefix = "car")
public class Car {
    private String brand;
    private double price;
}
//@ConfigurationProperties(prefix="car") car为配置文件定义的对象
System.out.println("--@ConfigurationProperties(prefix=car)--");
Car bean = run.getBean(Car.class);
System.out.println(bean);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eLQofNHx-1647133124157)(SpringBoot2.assets/image-20220312135932957.png)]

2、@EnableConfigurationProperties+@ConfigurationProperties

适用于实体类为第三方类上没有注册到容器中的注解

一定要在配置类中定义该注解

@Configuration(proxyBeanMethods = true) //配置类
//Import({User.class, CloudPlatform.class})
@ConditionalOnMissingBean(name = "aml")
@ImportResource("classpath:spring.xml")
@EnableConfigurationProperties(Car.class)//1、开启自动绑定功能 2、自动将此类交给Spring注册,可以不需要在实体类上加上Component注解
public class MyConfig {
    ......
}

3、自动配置原理入门

3.1、引导加载自动配置类

***@SpringBootApplication == @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan***

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
    
}
  • @AutoConfigurationPackage——自动配置包
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
    
}
AutoConfigurationPackages.Registrar.class内实现批量注册组件的方法(主程序类所在包下的所有标注的注解)
  • @Import(AutoConfigurationImportSelector.class)

核心:getAutoConfigurationEntry(annotationMetadata)

//AutoConfigurationImportSelector.class 该方法是具体导入需要注册组件
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
    if (!isEnabled(annotationMetadata)) {
        return NO_IMPORTS;
    }
    AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
    return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}

3.2、按需开启自动配置项

3.3、定制化修改自动配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xtGjb4PP-1647133124158)(SpringBoot2.assets/image-20220312151525378.png)]

//SpringBoot官方代码
@Bean
@ConditionalOnBean(MultipartResolver.class)
@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
public MultipartResolver multipartResolver(MultipartResolver resolver) {
    // Detect if the user has created a MultipartResolver but named it incorrectly
    return resolver;
}

@Bean
@ConditionalOnBean({MultipartResolver.class})
@ConditionalOnMissingBean(
    name = {"multipartResolver"}
)
public MultipartResolver multipartResolver(MultipartResolver resolver) {
    return resolver;
}

SpringBoot默认会配置好所有的组件,如果用户也配置了,则以用户配置的优先!!!因为@Conditional

总结:

  • SpringBoot先加载所有的自动配置类,xxxAutoConfiguration
  • 每个自动配置类按照条件进行生效
  • 生效的配置类就会给容器中装配很多组件
  • 只要容器中有这些组件,相当于这些功能就有了
  • 只要用户自己配置了,就以用户配置的为主
  • 每个自动配置类生效就会绑定对应配置文件指定的值,xxxProperties——application的配置文件
  • 定制化配置
    • 用户直接自己@Bean替换底层的组件
    • 直接修改配置文件相关的值

3.4、最佳实践

  • 引入场景依赖
  • 查看提供了哪些自动配置
  • 是否需要修改
举报

相关推荐

0 条评论