SpringBoot快速入门

Spring boot是一个脚手架(而非框架),构建于Spring框架(Framework)基础之上,基于快速构建理念,提供了自动配置功能,可实现其开箱即用特性(创建完一个基本的项目以后,可零配置或者少量配置即可运行我们的项目),其核心主要有如下几个方面:

  • 起步依赖(Starter Dependency)-启动依赖;
  • 自动配置(Auto Configuration)-开箱即用;
  • 健康检查(Actator)-健康监控;

文章目录

    • 一、项目创建及结构分析
    • 二、项目业务初步实现及测试
        • (一)业务实现:
        • (二)项目业务增强实现及测试
        • FAQ分析


一、项目创建及结构分析


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

  1. 打开项目新建窗口(快捷键ctrl+n), 搜索spring,选择spring starter 项目。
    SpringBoot快速入门_第1张图片

  2. 填写项目基本信息
    SpringBoot快速入门_第2张图片

  3. 选择Spring Boot版本
    SpringBoot快速入门_第3张图片

  4. 点击finish之后,项目便开始从maven配置中指定的私服服务器(例如阿里云的maven服务器)去下载起步依赖(SpringBoot项目中默认指定了项目启动时需要的一些jar包依赖),这个过程可能会比较耗时(网络最好不要用手机网络,会导致很多资源下载不下来),假如指定版本的springboot项目以前创建过,它会默认先从本地库查找,假如本地库没有,则从远程库去下载。

    所以第一次新建项目可能会耗时比较长;

  5. 创建成功之后完整的包视图目录结构
    SpringBoot快速入门_第4张图片

  6. 项目启动过程分析

    (1) 找到项目的入口类(使用了@SpringBootApplication注解描述),然后运行启动类,检测启动过程,SpringBoot在启动时,控制台会出现如图所示标识
    SpringBoot快速入门_第5张图片
    (2) 项目启动时发生了什么呢?
    SpringBoot快速入门_第6张图片
    ①: SpringBoot 项目在启动时,首先基于启动入口类上的注解描述,进行自动配置并扫描指定包以及子包中的类进行加载,然后检测类上是否有Spring框架中指定的注解描述(例如@Component,@Controller,@Service等);

    ②: 假如有,则将类交给Spring框架中的BeanFactory工厂接口的实现类对象,此工厂对象会基于反射创建Bean的实例,假如此Bean指定了生命周期方法,还会调用生命周期方法。当实例创建以后,Spring框架还会基于类的作用域描述,将实例存储到不同作用域的容器中。以实现Bean对象的科学应用。

    ③: 由@SpringBootApplication 此注解描述的类为springboot项目的启动类(入口)

    • 这样的类,一个项目只能有一个
    • 此类在运行时时会启动项目的自动配置,并扫描此类所在包以及子包中的资源然后进行加载(将类读到内存)

    ④: 如何把一个类交给spring去管理
    (a)将类放在启动类所在包及子包中
    (b)将此类使用spring指定注解进行描述(例如:@Component,@service,…)

    ⑤: 如何跟踪这个类是否被加载了?

    • 通过JVM参数设置进行跟踪:-XX:+TraceClassLoading

二、项目业务初步实现及测试


(一)业务实现:

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

1、创建一个DefaultCache类然后交给spring 管理。

package com.cy.pj.common.cache;
@Component
	
public class DefaultCache {}

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

2、添加sringboot 测试类,进行bean的获取及测试,要放在test目录中

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;

/*
 * SpringBoot脚手架工程单元测试类要使用@SpringBootTest注解进行描述
 * 	1)第一他是测试类
 * 	2)此类会交给Spring管理(例如创建对象,为对象属性赋值)
 */
@SpringBootTest
public class DefaultCacheTests {
	/*
	 * @Autowired描述属性时,Spring框架会按照一定的规则为属性赋值
	 * 	1)赋值时,首先进行查找(从spring容器中查找匹配对象--依赖查找--DL)
	 * 	2)通过反射未属性赋值(依赖注入--DI)
	 */
	@Autowired
	private DefaultCache defaultCache;
	
	@Test
	public void testDefaultCache() {
		System.out.println(defaultCache);
	}
}

其中:

  • @SpringBootTest 注解用于告诉spring框架,此测试类交给spring管理。
  • @Autowired注解描述属性时,用于告诉spring框架要为此属性注入一个值?
  • @Test是测试类,Junit用的是5,导包为import org.junit.jupiter.api.Test;Junit4也可以,自己选择一个就可以

3、代码设计及运行分析
SpringBoot快速入门_第7张图片
图片描述的是DefaultCacheTests类与DefaultCache类的关系,这两个类通过指定注解(@SpringBootTest,@Component)进行了描述,其意图是告诉spring框架这个两个类的实例的创建由Spring负责,并且由Spring框架基于@Autowired注解的描述完成DefaultCacheTests实例中有关DefaultCache类型的值的注入(DI)。

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

package com.cy.pj.common.cache;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

/*
 * @Component是Spring中用于描述Bean类的一个注解。
 * 	用于告诉Spring这个类的实例由Spring创建,当此对象由Spring创建和管理时,默认会将对象存储到池(Bean池)中。
 */
@Component("cache")
//singleton:单例作用域,默认作用域,此作用域在内存中只有一份
	//@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
//prototype:多例作用域,此作用域的对象spring容器不负责存储,只负责创建和初始化
	//@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)//多例作用域

@Scope("singleton")//描述类,告诉spring框架,此类支持延迟加载,通常会配合单例作用域使用
@Lazy//①外界不使用此对象时,这个对象不会创建;②大对象,稀少用,可考虑使用懒加载
public class DefaultCache{
	public DefaultCache(){
		System.out.println("DefaultCache.DefaultCache()...");
	}
	@PostConstruct//用于描述bean对象生命周期方法中的初始化方法,此方法会在对象的构造方法之后执行
	public void init() {
		System.out.println("DefaultCache.init()...");
	}
	//用于描述bean对象生命周期方法中的销毁方法,此方法会在对象销毁之前执行
	//(当作用域为prototype时,此方法不再执行)
	@PreDestroy
	public void destory() {
		System.out.println("DefaultCache.destory()...");
	}
}

其中:

  • @Scope 是Spring中用于定义Bean对象作用域的一个注解,其常用的值有singleton(整个内存有一份Bean实例,此实例何时创建与类的延迟加载特性配置有关,此实例创建以后,生命周期会由spring框架管理);prototype(每次获取都会创建新实例,此实例会在需要时创建与lazy特性无关,这个实例创建以后,不会交给spring管理,spring可以对其初始化,但不负责销毁;)等。
    • 使用频率高的用单例,singleton
    • 使用频率低的用多例,prototype
  • @Lazy注解用于描述类,其目的是告诉spring框架此类支持延迟加载,通常会配合单例作用域使用。
  • @PostConstruct 注解用于描述bean对象生命周期方法中的初始化方法,此方法会在对象的构造方法之后执行。
  • @PreDestroy 注解用于描述Bean对象生命周期方法中的销毁方法,此方法会在对象销毁之前执行(当作用域为prototype时,此方法不会执行)

5、通过测试类测试作用域,延迟加载,生命周期方法

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;

/*
 * SpringBoot脚手架工程单元测试类要使用@SpringBootTest注解进行描述
 * 	1)第一他是测试类
 * 	2)此类会交给Spring管理(例如创建对象,为对象属性赋值)
 */
@SpringBootTest
public class DefaultCacheTests {
	/*
	 * @Autowired描述属性时,Spring框架会按照一定的规则为属性赋值
	 * 	1)赋值时,首先进行查找(从spring容器中查找匹配对象--依赖查找--DL)
	 * 	2)通过反射未属性赋值(依赖注入--DI)
	 */
	@Autowired
	private DefaultCache defaultCache;
	
	@Test
	public void testDefaultCache() {
		System.out.println(defaultCache);
	}
}

总结:Spring框架管理Bean对象有什么优势吗?(为什么我们要将类的对象交给spring管理呢?)

  1. 可维护性,可扩展性
    解耦-对象的创建由工厂负责,然后我们耦合与工厂,需要对象时从工厂获取
  2. 高效,低耗
    (1)通过池管理对象-bean池 ------> 享元模式/亨元模式
    (2)延迟加载-lazy ------> 懒加载
    (3)作用域-scope ------> 生命周期

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

(二)项目业务增强实现及测试

1、定义业务Cache接口.

package com.cy.pj.common.cache;

public interface Cache {
	
}

2、定义WeakCache实现Cache接口.

package com.cy.pj.common.cache;

import org.springframework.stereotype.Component;

@Component
public class WeakCache implements Cache {

}

3、创建或修改DefaultCache,让此类也实现Cache接口.

package com.cy.pj.common.cache;

import org.springframework.stereotype.Component;

//@Component("cache")
@Component
public class DefaultCache implements Cache {

}

4、单元测试类

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 CacheTest {
	/*
	 * spring容器为此属性按照怎样的规则进行依赖注入(赋值)
	 * 	1)首先,按照类型从spring容器进行查找,假如找到一个则直接注入,
	 * 		没找到则抛出NoSuchBeanDefinitionException异常
	 * 	2)其次,假如此类型的对象有多个,此时还会基于属性名进行匹配,
	 * 		名字匹配的对象可直接注入,名字不匹配的则会抛出NoUniqueBeanDefinitionException异常
	 * 	3)再次,我们也可以显式为属性要注入的对象指定其名字,可以通过@Qualifier注解进行指定
	 * 		(此注解配合@Autowired注解使用)
	 */
	@Autowired
	@Qualifier("weakCache")//后面可以指定找哪个
	private Cache cache;
	
	@Test
	void testCache() {
		System.out.println(cache);
	}
}

SpringBoot快速入门_第9张图片
SpringBoot快速入门_第10张图片
5、业务测试运行原理分析
SpringBoot快速入门_第11张图片

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

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

FAQ分析

  1. Maven工具(项目构建工具)从哪里下载?—官网链接
  2. STS(集成了spring插件的eclipse)工具从哪里下载?—官网链接
  3. STS新版本怎么安装?
    —例如STS4.6.1的安装可使用:java -jar xxx.jar
  4. Spring boot 项目的创建方式?
    —https://start.spring.io
  5. Spring boot项目启动时,Bean的初始化过程是怎样的?
    —查找,加载,读和存储配置,创建和存储实例对象
  6. Spring boot 项目启动时,Bean对象的依赖注入过程是怎样的?
    —标记,查找,注入
  7. 创建spring starter 项目时pom.xml文件错误?
    —检查工具版本,maven私服,本地库,maven update,网络等
  8. Spring Boot项目中支持的配置文件后缀有哪些?
    .properties,.yml
  9. SpringBoot 启动类的包扫描位置?
    —启动类所在包以及子包
  10. SpringBoot项目中可以有多个启动类吗?
    —不可以
  11. 如何理解Spring框架?
    —资源整合框架,
    —科学应用对象-资源
    —低耦合
  12. spring管理bean对象时有什么优势?
    — 为bean赋予了更加高级的特性,懒加载,单例作用域,生命周期方法
    ……

如果开发环境配置有问题请参考
https://blog.csdn.net/qq1808814025/article/details/106437355

你可能感兴趣的:(spring,Java,框架)