SpringBoot入门

1.SpringBoot简介

1.1 Spring Boot概述

现在软件市场已经形成一定的规模,系统架构的复杂度也越来越高(例如有单体架构,分布式架构,微服务架构)。软件的整个架构体系正在发生很大变化,在这种变化中,企业现在更注重技术的开箱即用,更注重技术在生态圈中的深度融合,更注重轻量级的运维。由此spring boot诞生。
说明:学技术一定要了解技术发展史,并对技术的发展有一定的前瞻性。

1.2 Spring Boot核心特性

2.SpringBoot环境配置

2.1 准备工作

2.2 Maven 基本配置

打开maven中的setting.xml 文件,并对其如下选项进行配置。

    • 配置maven本地库 (从maven远程服务器下载的资源存储到的位置)

               `<localRepository>${user.home}/.m5/repository</localRepository>`
    • 配置maven私服(配置到mirrors标签内部)。

      <mirror>
       <id>aliyun</id>
       <name>aliyun for maven</name>
       <mirrorOf>\*</mirrorOf>
       <url>https://maven.aliyun.com/repository/public</url>
       </mirror>
    • 配置maven中的profile(配置到profiles标签内部),设置JDK编译和运行版本。
    <profile>
     <id>jdk-1.8</id>
     <activation>
     <activeByDefault>true</activeByDefault>
     <jdk>1.8</jdk>
     </activation>
     <properties>
     <maven.compiler.source>1.8</maven.compiler.source>
     <maven.compiler.target>1.8</maven.compiler.target>
      <maven.compiler.compilerVersion>
     1.8
     </maven.compiler.compilerVersion>
     </properties>
     </profile>

    2.3 STS整合 maven 配置

    • 2.3.1 启动STS工具(特殊的eclipse,添加了spring开发插件)
    • 2.3.2 Maven Installations配置, 如图所示:

    image

    • 2.3.3 Maven User Settings配置,如图所示:

    image

    2.4 STS 工具使用基本优化(可选)

    • 2.4.1 禁用拼写检查, 取消图中所示的拼写检查选项

    image

    • 2.4.2 取消图中所示的连接选项配置

    image

    • 2.4.3 关掉图中的校验功能

    image

    • 2.4.4 修改STS工具内存配置,打开SpringToolSuite4.ini文件,修改堆大小,如图所示:

    image

    3.Spring Boot 快速入门

    3.1项目创建及结构分析

    打开STS 集成开发工具,创建spring boot项目,其具体步骤如下:

    • 第一步:打开项目新建窗口(快捷键ctrl+n), 搜索spring,选择spring starter 项目。如图所示:

    image.png

    • 第二步: 填写项目基本信息。如图所示:

    image.png

    • 第三步: 选择Spring Boot版本。如图所示:

    image.png
    点击finish之后,项目便开始从maven配置中指定的私服(例如阿里云的maven服务器)去下载起步依赖(SpringBoot项目中默认指定了项目启动时需要的一些jar包依赖),这个过程可能会比较耗时(网络最好不要用手机网络,会导致很多资源下载不下来),假如指定版本的springboot项目以前创建过,它会默认先从本地库查找,假如本地库没有,则从远程库去下载。
    项目创建成功以后,其包视图(Package Explorer)结构,如图所示:
    image.png
    其中,在上图呈现的项目结构中,所有的类和配置文件都是创建好项目以后,由STS工具帮我们自动创建的。(假如你是普通的maven项目,这些类还有配置文件需要我们自己手动创建)

    3.2 项目启动过程

    找到项目的入口类(使用了@SpringBootApplication注解描述),然后运行启动类,检测启动过程,SpringBoot在启动时,控制台会出现如图标识:
    image.png
    项目启动时发生了什么呢? 参考下图:
    image
    SpringBoot 项目在启动时,首先基于启动入口类上的注解描述,进行自动配置并扫描指定包以及子包中的类进行加载,然后检测类上是否有Spring框架中指定的注解描述(例如@Component,@Controller,@Service等)。假如有,则将类交给Spring框架中的BeanFactory工厂接口的实现类对象,此工厂对象会基于反射创建Bean的实例,假如此Bean指定了生命周期方法,还会调用生命周期方法。当实例创建以后,Spring框架还会基于类的作用域描述,将实例存储到不同作用域的容器中。以实现Bean对象的科学应用。

    3.3 项目业务初步实现及测试

    业务实现:
    基于SpringBoot脚手架(或者架子工),通过Spring框架进行Bean对象的管理实现。

    • 第一步:

    创建一个DefaultCache类,存储到 src/main/java 目录,然后交给Spring管理。

    package com.cy.pj.common.cache;
    import org.springframework.stereotype.Component;
    /*
    *FAQ 在SpringBoot工程中如何将一个类的实例交给Spring创建和管理?
    *1)将类放在启动类所在包或子包中
    *2)将类使用Spring框架中指定注解进行描述,例如@Component
    */
    @Component //注解起的作用就是作标记
    public class DefaultCache {
            
    }

    其中,@Component是Spring中用于描述Bean类的一个注解。用于告诉Spring这个类的实例由Spring创建,当此对象由Spring创建和管理时,默认会将对象存储到池(Bean池)中。

    • 第二步:

    添加 springboot 测试类,进行bean的获取及测试,要放在src/test/java目录中:

    package com.cy.pj.common.cache;
    
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    @SpringBootTest //SpringBoot工程中的单元测试类需要使用此注解进行描述
    public class DefaultCacheTest {
        /** @Autowired 告诉spring框架运行时为此属性注入一个值 */
        @Autowired
        private DefaultCache defaultCache;
        @Test
        public void  testCache(){
            System.out.println("defaultCache="+defaultCache);
        }
        
    }

    其中:
    @SpringBootTest注解用于告诉spring框架,此测试类交给spring管理。
    @Autowired注解描述属性时,用于告诉spring框架要为此属性注入一个值

    <br/><br/>

    • 第三步:
      代码设计及运行分析,如图所示:

    image.png

    图中描述了DefaultCacheTests类与DefaultCache类的关系,这两个类通过指定注解(@SpringBootTest,@Component)进行了描述,其意图是告诉Spring框架这个两个类的实例的创建由Spring负责,并且由Spring框架基于@Autowired注解的描述完成DefaultCacheTests实例中有关DefaultCache类型的值的注入 (DI)

    异常类型: NoSuchBeanDefini tionException
    我们在STS中按 Ctrl+Shift+T打开查找框
    image.png
    image.png
    image.png
    • 第四步:

    为对象设置作用域,设置延迟加载,设置生命周期方法(了解)

    在Spring框架中,Spring为由它创建和管理对象,设计了一些特性 , 例如 作用域,延迟加载,生命周期方法等,基于这些特性实现对Bean 对象的管理。

    package com.cy.pj.common.pool;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    
    import org.springframework.context.annotation.Lazy;
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Component;
    
    /**
     * FAQ?
     * 1)假如将此类交给spring管理,请问spring何时创建此对象?
     * -- spring容器在启动的时候就会创建这种类型的实例
     * 2)假如一个对象创建以后,存储到内存,长时间不用会有什么影响?
     * --  占用资源!!
     * 3)你知道Spring中,Bean对象的延迟加载特性吗?
     * -- 延迟加载就是按需加载,需要时去加载这个对象,不需要时就不要加载
     * 4)你知道什么场景下这个对象适合延迟加载吗?
     * -- 大对象, 稀少用
     * 5)对象创建以后,应用结束要销毁对象吗?
     * --如果对象使用频繁,每次用完都销毁,每次再使用就要再创建,对内存影响大。
     * 6)程序中的每个对象都有生命周期(正确),不见得每个对象都有生命周期方法。
     */
    
    //@Lazy(true)
    @Lazy                 //(延迟加载/懒加载)此注解用于告诉spring框架,它描述的类的实例,假如暂时用不到,就不要先创建
    @Scope("singleton")  //默认就是单例作用域(这个类的实例在一个spring容器中默认只有一份)
    //@Scope("prototype") 每次从spring容器获取对象都会创建一个新的实例 
    @Component 
    public class ObjectPool {
        /*构造方法*/    
         public ObjectPool() {
             System.out.println("ObjectPool()");     
         }
         /* @PostConstruct 注解描述的方法会在对象构建以后执行,用于执行一些初始化操作*/
         @PostConstruct
         public void init() {
            System.out.println("ObjectPool.init()");
         }
         /**
          * @PreDestroy 注解描述的方法会在 单例 对象销毁之前执行, spring容器在销毁之前会先将容器(Bean池)中的对象进行移除,
          **在移除对象时,假如对象中定义了生命周期销毁方法,此时还会调用对象的生命周期销毁方法
          */
         @PreDestroy
         public void close() {
             System.out.println("ObjectPool.close()");
         }
    }

    其中:

    • @Lazy 注解用于描述类,其目的是告诉Spring框架此类支持延迟加载,通常会配合单例作用域使用。
    • @Scope 是Spring中用于定义Bean对象作用域的一个注解,其常用的值有 singleton(整个内存有一份Bean实例,此实例何时创建与类的延迟加载特性配置有关,此实例创建以后,生命周期会由Spring框架管理),

    prototype(每次获取都会创建新实例,此实例会在需要时创建    与lazy特性无关,这个实例创建以后,不会交给Spring管理,Spring可以对其初始化,但不负责销毁。)等..

    • @PostConstruct 注解用于表述Bean对象生命周期方法中的初始化方法,此方法会在对象的构造方法之后执行(是对象创建以后的初始化)。
    • @PreDestroy 注解用于描述Bean对象生命周期方法中的销毁方法,此方法会在对象销毁之前执行(当作用域为prototype时,此方法不会执行)。

    第五步:
    通过测试类测试作用域,延迟加载,生命周期方法。

    package com.cy.pj.common.cache;
    @SpringBootTest
    public class ObjectPoolTests {
            @Autowired
            private ObjectPool objectPool;
            @Test
            public void testObjectPool() {
                    //???
            }
    }

    通过对上面小节的学习

    能说说Spring框架管理Bean对象有什么优势吗?(面试)
    Spring 是一个资源整合框架(Framework),通过spring可将很多资源(自己写的对象或第三方提供的对象,例如连接池等)整合在一起,然后进行科学应用,以便更好的对外提供服务。如图所示:
    image.png
    在图中,Spring框架可以为由它管理的对象(Bean)提供懒加载策略(对象暂时用不到,则无需加载和实例化),作用域(例如singleton-频繁用时可以考虑内存中只有一份,prototype-使用次数少时可以用时创建,不用时销毁),生命周期方法(更好实现对象的初始化和资源销毁),以实现对象对系统资源的有效使用。同时Spring框架还可以基于用户设计管理对象与对象的依赖关系,以降低对象与对象之间的直接耦合,提高程序的可维护性和可扩展性。

    3.4项目业务增强实现及测试

    假如一个接口的实现类的对象有多个,并且这些对象都交给了spring管理,那么另外一个类,现在依赖于这个接口,spring怎么注入?

    • 第一步: 定义业务Cache接口
    package com.cy.pj.common.cache;
    public interface Cache {
    }
    • 第二步: 定义WeakCache实现Cache接口
    package com.cy.pj.common.cache;
    import org.springframework.stereotype.Component;
    @Component     
    public class WeakCache implements Cache{
    }
    • 第三步: 创建或修改SoftCache,让此类也实现Cache接口,关键代码如下:
    package com.cy.pj.common.cache;
    @Component
    public class SoftCache implements Cache{
    …
    }
    • 第四步: 单元测试类
    package com.cy.pj.common.cache;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.test.context.SpringBootTest;
    @SpringBootTest
            
    public class CacheTests {
            @Autowired
            @Qualifier("softCache")
            private Cache cache;
            
            @Test
            public void testCache() {
                    System.out.println(cache);
            }
    }

    image.png

    思考:

    1. @Autowired注解应用规则?
    2. @Qualifier注解的作用是什么?

    @Autowired由spring框架定义,用于描述类中属性或相关方法(例如构造方法)。Spring框架在项目运行时假如发现由他管理的Bean对象中有使用@Autowired注解描述的属性或方法,可以按照指定规则为属性赋值(DI)。其基本规则是:首先要检测容器中是否有与属性或方法参数类型相匹配的对象,假如有并且只有一个则直接注入。其次,假如检测到有多个,还会按照@Autowired描述的属性或方法参数名查找是否有名字匹配的对象,有则直接注入,没有则抛出异常。最后,假如我们有明确要求,必须要注入类型为指定类型,名字为指定名字的对象还可以使用@Qualifier注解对其属性或参数进行描述(此注解必须配合@Autowired注解使用)。具体过程可参考上图的设计进行自行尝试和实践。


    Tsuki
    1 声望1 粉丝

    下一篇 »
    SpringBoot基础