03、了解自动配置原理

1、SpringBoot特点

1.1、依赖管理

  • 父项目做依赖管理
依赖管理    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>2.3.4.RELEASE</version></parent>他的父项目 <parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-dependencies</artifactId>    <version>2.3.4.RELEASE</version>  </parent>几乎声明了所有开发中常用的依赖的版本号,自动版本仲裁机制

  开发导入starter场景启动器

1、见到很多 spring-boot-starter-* : *就某种场景2、只要引入starter,这个场景的所有常规需要的依赖我们都自动引入3、SpringBoot所有支持的场景https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter4、见到的  *-spring-boot-starter: 第三方为我们提供的简化开发的场景启动器。5、所有场景启动器最底层的依赖<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter</artifactId>  <version>2.3.4.RELEASE</version>  <scope>compile</scope></dependency>

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

1、引入依赖默认都可以不写版本2、引入非版本仲裁的jar,要写版本号。

  可以修改默认版本号

1、查看spring-boot-dependencies里面规定当前依赖的版本 用的 key。2、在当前项目里面重写配置    <properties>        <mysql.version>5.1.43</mysql.version>    </properties>

1.2、自动配置

  • 自动配好Tomcat
    • 引入Tomcat依赖。
    • 配置Tomcat
      <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-tomcat</artifactId>      <version>2.3.4.RELEASE</version>      <scope>compile</scope>    </dependency>  

  

  • 自动配好SpringMVC
    • 引入SpringMVC全套组件
    • 自动配好SpringMVC常用组件(功能)
  • 自动配好Web常见功能,如:字符编码问题
    • SpringBoot帮我们配置好了所有web开发的常见场景
  • 默认的包结构
    • 主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来
    • 无需以前的包扫描配置
    • 想要改变扫描路径,@SpringBootApplication(scanBasePackages="com.atguigu")
      • 或者@ComponentScan 指定扫描路径
@SpringBootApplication等同于@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan("com.atguigu.boot")

  

  • 各种配置拥有默认值
    • 默认配置最终都是映射到某个类上,如:MultipartProperties
    • 配置文件的值最终会绑定某个类上,这个类会在容器中创建对象
  • 按需加载所有自动配置项
    • 非常多的starter
    • 引入了哪些场景这个场景的自动配置才会开启
    • SpringBoot所有的自动配置功能都在 spring-boot-autoconfigure 包里面
  • ......
#############################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 == user1);        User user01 = run.getBean("user01", User.class);        Pet tom = run.getBean("tom", Pet.class);        System.out.println("用户的宠物:" (user01.getPet() == tom));    }}

  

  

来源:https://www.icode9.com/content-4-814451.html

(0)

相关推荐

  • jboss( WildFly)上运行 springboot程序

    WildFly,原名 JBoss AS(JBoss Application Server) 或者 JBoss,是一套应用程序服务器,属于开源的企业级 Java 中间件软件,用于实现基于 SOA 架构的 ...

  • jackson学习之九:springboot整合(配置文件)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 系列文章汇总 jackson学习之一:基本信息 jac ...

  • IDEA中SpringBoot搭建子父工程demo

    IDEA中SpringBoot搭建子父工程demo

  • Spring 和 SpringBoot 之间到底有啥区别?

    链接:http://uee.me/cNDC8 概述 对于 Spring和 SpringBoot到底有什么区别,我听到了很多答案,刚开始迈入学习 SpringBoot的我当时也是一头雾水,随着经验的积累 ...

  • 徒手撸一个Spring Boot中的starter,解密自动化配置

    starter背景 Spring Boot目前已经变成了后端开发这必备技能之一,其中一个主要原因是Spring Boot中有个非常重要的机制(starter机制). starter能够抛弃以前繁杂的配 ...

  • Jetty、Undertow容器及war包部署到外置Tomcat容器

    上一节中我们了解到在SpringBoot项目中webServer默认支持的嵌入式容器是Tomcat,还可以切换到Jetty.Undertow.本节我们就将Tomcat切换到jetty.undertow ...

  • SpringBoot源码解析-自定义Starter

    在SpringBoot学习的过程中,每当我们需要某个现有框架的功能时,都是通过引入对应的Starter,然后由SpringBoot帮我们完成自动装配.说白了,Starter就是个外部项目,就像项目A需 ...

  • Spring Boot自定义starter必知必会条件

    前言 在目前的Spring Boot框架中,不管是Spring Boot官方还是非官方,都提供了非常多的starter系列组件,助力开发者在企业应用中的开发,提升研发人员的工作效率,Spring Bo ...

  • SpringBoot源码解析-升级版自定义Starter

    分享 有用  返回 上一篇文章中,我们学习了如何自定义一个Starter,而今天要给大家分享的是复杂点的自定义Starter. 需求 自定义一个记录接口请求的Starter. 创建Starter项目 ...

  • SpringBoot-配置文件

    前言注解 总结一下注解方式的属性注入,顺便引入一下SpringBoot的注解@ConfigurationProperties 在Spring-IOC注解编程一章中了解的@PropertySource+ ...