Spring Boot 的入门案例、全注解配置和属性注入、自动配置原理

小七学习网,助您升职加薪,遇问题可联系:客服微信【1601371900】 备注:来自网站

相信读者能通过本文的学习,打下一定的 Spring Boot 技能基础,为后面 Spring 生态的扩展技术做充足的准备。 本文大致包含了以下几方面的讲解: Spring Boot 概念、为什么要学习…

相信读者能通过本文的学习,打下一定的 Spring Boot 技能基础,为后面 Spring 生态的扩展技术做充足的准备。

本文大致包含了以下几方面的讲解:

  1. Spring Boot 概念、为什么要学习 Spring Boot、Spring Boot 的特点;
  2. Spring Boot 入门案例讲解,包括创建 Spring Boot 工程,添加依赖等内容;
  3. Spring Boot 全注解配置和属性注入,包括 Spring 全注解配置,Spring Boot 的属性注入等内容;
  4. Spring Boot 自动配置原理。


Spring Boot 框架概述

Spring Boot 作为企业级微服务开发框架,近年来,互联网世界掀起了微服务热潮,微服务是将一个大的系统拆分成多个子系统,然后通过 REST 风格请求将它们集成起来,进一步简化了分布式系统的开发。为了进一步简化 Spring 的开发,2014 年 Spring Boot 诞生了,其设计的目的是简化 Spring 应用的搭建以及开发过程。并迎合时下流行的微服务思维。

Spring 框架是 Java EE 开发的强有力的工具和事实标准,而 Spring Boot 采用“约定优于配置”的原则简化了 Spring 的开发。从而成为业界最流行的微服务开发框架,已经被越来越多企业使用。在其内部提供了大量的 starter,就可以使用默认的约定,而这些 starter 又提供了许多自动配置类,让开发者可以奉行拿来主义,开箱即用。使开发更为简单;对于部署,Spring Boot 提供了内嵌服务器和 Maven 打包,进一步降低了企业部署的难度;对于测试,它提供了快速测试的环境,进一步提高了开发效率,因此它渐渐成为中小型企业甚至是一些大型企业开发的主流选择。

Spring Boot 允许通过 Maven 根据需要来获取 starter,这些 starter 可以直接获取开发所需要的相关包。通过这些 starter 项目就能以 Java Application 的形式运行 Spring Boot 的项目,而无需其他服务器配置。简化 Maven 配置,parent 这种方式,一站式引入需要的各种依赖。

Spring Boot 全注解配置和属性注入

Spring Boot 通过注解的描述生成对象。在 Spring 中把每一个需要管理的对象称为 Bean,而 Spring 管理这些 Bean 的容器就是 Spring IoC 容器。

在 Spring Boot 中我们主要是通过注解装配 Bean 到 Spring IoC 容器中。下面定义一个 Java 简单对象文件 Book.java,代码清单如下所示:

    package cn.com.binge.pojo;    public class Book {        public Long getId() {            return id;        }        public void setId(Long id) {            this.id = id;        }        public String getBookName() {            return bookName;        }        public void setBookName(String bookName) {            this.bookName = bookName;        }        public String getNote() {            return note;        }        public void setNote(String note) {            this.note = note;        }        private Long id;        private String bookName;        private String note;    }

然后再定义一个 Java 配置文件 BookConfig.java,代码清单如下所示:

    package cn.com.binge.config;    import cn.com.binge.pojo.Book;    import org.springframework.context.annotation.Bean;    import org.springframework.context.annotation.Configuration;    @Configuration    public class BookConfig {        @Bean        public Book bookInfo() {            Book bookInfo = new Book();            bookInfo.setId(1L);            bookInfo.setBookName(\"springboot\");            bookInfo.setNote(\"springbootnote\");            return bookInfo;        }    }

注解 @Configuration 代表这是一个 Java 配置文件,Spring 的容器会根据它来生成 IoC 容器去装配 Bean。@Bean 代表将 bookInfo 方法返回的对象装配到 IoC 容器中。

将 Java 配置文件 BookConfig.java 传递给 AnnotationConfigApplicationContext 的构造方法,这样它就可以读取配置了。然后将配置中的 Bean 装配到 IoC 容器中,于是可以使用 getBean 方法获取对应的对象,代码清单如下所示:

    package cn.com.binge.config;    import cn.com.binge.pojo.Book;    import org.slf4j.Logger;    import org.slf4j.LoggerFactory;    import org.springframework.context.ApplicationContext;    import org.springframework.context.annotation.AnnotationConfigApplicationContext;    public class SpingIoCTest {        private static Logger logger = LoggerFactory.getLogger(SpingIoCTest.class);        public static void main(String[] args) {            ApplicationContext applicationContext = new AnnotationConfigApplicationContext(BookConfig.class);            Book book = applicationContext.getBean(Book.class);            logger.info(book.getBookName());        }    }

在 Spring Boot 中我们还可以使用属性文件进行属性值注入,可以使用默认的配置文件 application.properties,我们先在 Maven 配置文件中加载依赖,在 pom.xml 文件中加入属性文件依赖,有了依赖,就可以直接使用 application.properties 属性文件了,如下代码清单所示:

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-configuration-processor</artifactId>    <optional>true</optional></dependency>

我们接下来用 java 配置来实现属性注入,这里可以使用 application.properties 配置属性文件编写 book 属性,代码清单如下所示:

    book.id=8    book.bookName=springbootnew    book.note=springbootnotenew

application.properties 这是 Spring Boot 默认读取的属性文件名,它会通过其机制读取到上下文中,这样就可以引用它了。

先创建一个 BookProperties.java 类,代码清单如下所示:

     package cn.com.binge.pojo;    import org.springframework.beans.factory.annotation.Value;    import org.springframework.stereotype.Component;    @Component    public class BookProperties {        @Value(\"${book.id}\")        private Long id;        @Value(\"${book.bookName}\")        private String bookName;        public Long getId() {            return id;        }        public void setId(Long id) {            this.id = id;        }        public String getBookName() {            return bookName;        }        public void setBookName(String bookName) {            this.bookName = bookName;        }        public String getNote() {            return note;        }        public void setNote(String note) {            this.note = note;        }        @Value(\"${book.note}\")        private String note;    }

这样我们就可以通过注解 @Value,使用占位符 ${......} 读取配置在属性文件中的内容。

Spring Boot 的依赖和自动装配

Spring Boot 的依赖

下面我们讨论 Spring Boot 为何在很少的配置下就能够运行。下面我们以最常见的 Spring MVC 为例进行说明。首先打开 Maven 的本地仓库,找到对应 Spring Boot 文件夹,可以看到如下图所示目录:

在这里插入图片描述

打开 /spring-boot-starter-web/2.4.1/ 目录,就可以看到一个名为 spring-boot-starter-web-2.4.1.pom 的文件,打开它就可以看到如下代码清单所示的代码:

<!--Spring Boot 的依赖--><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter</artifactId>    <version>2.4.1</version>    <scope>compile</scope></dependency>
<!--JSON 的依赖--><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-json</artifactId>    <version>2.4.1</version>    <scope>compile</scope></dependency>
<!--Tomcat 的依赖--><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-tomcat</artifactId>    <version>2.4.1</version>    <scope>compile</scope></dependency>
<!--Spring Web 的依赖--><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-web</artifactId>    <version>5.3.2</version>    <scope>compile</scope></dependency>
<!--Spring Web MVC 的依赖--><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-webmvc</artifactId>    <version>5.3.2</version>    <scope>compile</scope></dependency>

从上面的代码可以看出,当加入 spring-boot-starter-web 后,它会通过 Maven 将对应的资源加载到我们工程中,这样便能够形成依赖。

Spring Boot 自动装配原理

在大部分的情况下,Spring Boot 允许通过配置文件自动装配 Bean。那是因为它依赖 spring-boot-starter-web 包,于是会引入 spring-boot-starters 包,进而引入 spring-boot-autoconfigure 包。这个包会提供自动配置的功能。有关自动配置的类很多,一共存在几十个配置类,这里截取两个典型的配置类来说明它大概的原理,例如,使用 Redis 常用 RedisAutoConfiguration 配置类进行说明。源代码如代码清单所示:

    @Configuration(        proxyBeanMethods = false    )    @ConditionalOnClass({RedisOperations.class})    @EnableConfigurationProperties({RedisProperties.class})    @Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})    public class RedisAutoConfiguration {        public RedisAutoConfiguration() {        }        @Bean        @ConditionalOnMissingBean(            name = {\"redisTemplate\"}        )        @ConditionalOnSingleCandidate(RedisConnectionFactory.class)        public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {            RedisTemplate<Object, Object> template = new RedisTemplate();            template.setConnectionFactory(redisConnectionFactory);            return template;        }        @Bean        @ConditionalOnMissingBean        @ConditionalOnSingleCandidate(RedisConnectionFactory.class)        public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {            StringRedisTemplate template = new StringRedisTemplate();            template.setConnectionFactory(redisConnectionFactory);            return template;        }    }

代码中最核心的内容主要包括,首先是注解 @Configuration,它代表这是一个配置类。但是接着可以看到注解 @ConditionalOnClass 的使用,这个注解是常见的注解之一,它可以配置存在哪些类,这里配置了 RedisOperations.class。在存在这个类后,Spring IoC 容器才去装配`RedisAutoConfiguration 这个类。注解 @EnableConfigurationProperties 则是使得哪个类可以通过配置文件装配,这里指定为 RedisProperties.class,这样就可以通过文件配置了,这就是可以在 application.properties 文件中配置它的原因。

总结

Spring 主要在简化开发人员面临的各种挑战,比如创建 Web 应用程序、处理数据库、以及实现微服务。Spring Boot 构建在 Spring 之上,通过简化依赖管理、自动配置和运行时洞察,使 Spring 更加易用。在 Spring 应用上下文中,组件 Bean 可以使用 Spring Boot 自动配置功能实现自动化配置。

小七学习网,助您升职加薪,遇问题可联系:客服微信【1601371900】 备注:来自网站

免责声明: 1、本站信息来自网络,版权争议与本站无关 2、本站所有主题由该帖子作者发表,该帖子作者与本站享有帖子相关版权 3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和本站的同意 4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责 5、用户所发布的一切软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 6、您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 7、请支持正版软件、得到更好的正版服务。 8、如有侵权请立即告知本站(邮箱:1099252741@qq.com,备用微信:1099252741),本站将及时予与删除 9、本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章和视频仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。