超实用的SpringBoot简单入门

SpringBoot入门

1. Maven基本配置

1. 配置本地库<locolRepository>
2. 配置私服<mirror>
3. 配置用户偏好<profiles>

2. 配置sts及基本优化

1. 配置maven
2. 修改工作空间编码:utf8
3. 关闭拼写检查(优化)![1](https://img-blog.csdnimg.cn/20200808092708678.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTAxNTIxNA==,size_16,color_FFFFFF,t_70)

4. 关闭超链接复制(优化)![2](https://img-blog.csdnimg.cn/20200808092724337.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTAxNTIxNA==,size_16,color_FFFFFF,t_70)

5. 关闭校验功能(优化)![3](https://img-blog.csdnimg.cn/20200808092742355.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTAxNTIxNA==,size_16,color_FFFFFF,t_70)

6. 关闭自动更新(优化)![4](https://img-blog.csdnimg.cn/20200808092823242.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTAxNTIxNA==,size_16,color_FFFFFF,t_70)

7. 修改.ini文件![5](https://img-blog.csdnimg.cn/20200808092839772.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTAxNTIxNA==,size_16,color_FFFFFF,t_70)
  • 可能的bug6

3.创建项目

1. 方法一:![01](https://img-blog.csdnimg.cn/20200808092944837.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTAxNTIxNA==,size_16,color_FFFFFF,t_70)

2. 方法二:![02](https://img-blog.csdnimg.cn/20200808093013147.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTAxNTIxNA==,size_16,color_FFFFFF,t_70)

03

3. 方法三![04](https://img-blog.csdnimg.cn/20200808093039247.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTAxNTIxNA==,size_16,color_FFFFFF,t_70)

4.项目结构05

  • JRE System Library建议配置jdk目录下的jre06

5.SpringBoot工程启动过程(了解)

思考:SpringBoot工程在启动时会做些什么?07

  • 1)通过线程调用相关API从指定路径查找相关的配置文件,class文件.
  • 2)调用IO对象从磁盘中读取文件(将文件内容读到内存,CPU只能从内存中存储数据)
  • 3)检测类是否有特定注解描述(例如@Controller,@Service,…)
  • 4)Spring框架基于工厂对象(BeanFactory)为指定class创建其实例对象,并基于置描述对这些对象进行初始化操作.
  • 5)将对象存储到Spring框架管理的池中(Bean池-其底层设计在这里是一个map)

6. 为项目业务初步实现及测试

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

package com.cy.pj.common.cache;
import org.springframework.stereotype.Component;

@Component
public class DefaultCache {

}

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

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

package com.cy.pj.common.test;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import com.cy.pj.common.cache.DefaultCache;

@SpringBootTest //这个注解描述的类也会由spring框架进行创建,并且进行值的
public class DefaultCacheTests {
	
	/**
	 * has a
	 * @Autowired 注解描述的属性,由Spring框架进行值的注入(赋值)
	 */
	@Autowired
	private DefaultCache defaultCache;
	
	@Test
	void testDefaultCache() {
		System.out.println("DefaultCache="+defaultCache);
	}
}

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

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

在这里插入图片描述

  • Autowired 依赖注入分为两个步骤

    Dependency lookupDependency injection
    依赖查找依赖注入

第四步:为对象设置作用域,设置延迟加载(又称按需加载),设置生命周期方法

  • 一般情况下,只有在配置类种才会用@Bean去描述方法(SpringBootConfiguration),且这种方法一般适用于整合第三方资源。
  • 加入一个注解只有value,那么value可以直接省略(例如@Lazy(value=true)可以写成@Lazy(true))
  • 为什么要将对象交给Spring去创建–
      1. 延迟加载
      2. 可以为bean设置作用域
      3. 可以为bean设置声明周期
  • 可能的bug

    09
    010

假设此对象为一个对象池

1)此对象要交给spring管理(SpringBoot工程下)

  • 1.1)类的位置(必须方法在启动类所在包以及子包中)
  • 1.2)类的描述(使用@Component注解)

2)需要此对象的地方可以从spring的bean池中获取

1)如何判定一个对象在何时创建的?(日志分析(打桩)/断点) —在启动时

2)Spring容器中的Bean对象默认在启动时创建,但长时间又不使用这个对象,你觉得先把对象创建出来好吗?

(不好!它就会占内存资源,尤其是一些大对象–例如(int[] array = new int[Integer.MAX_VALUE];(这段语句需要初始化超多的对象))

  • 	池中一般为数组(Object[])或者链表(LinkedList[]);
    

3)假如不希望Spring容器中的Bean对象在容器启动时进行创建,该如何设计呢?(延迟加载)

@Lazy 注解----@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.FIELD})

  • 可以描述类/方法/构造方法/方法参数/属性----但是支持延迟加载的其实只有类和方法

延迟加载(又称懒加载/按需加载)都有哪些应用场景?

  • 1)大对象(例如一些池化资源(池对象),稀少用(例如容器初始化时会创建对象,但是这个对象我们并用不到)--适合设置延迟加载
    
  •    2)非单例对象(对象每次使用都需要创建一个新的对象)---不适合设置延迟加载
    

@Scope 描述类时用于指定类实例的作用域(默认为单例作用域–在一个JVM中类的实例只有一份),常用取值:

  • 1)singleton:默认选项。此作用域通常会配合@Lazy一起使用,一般可应用于可重用对象。对于这样的对象,spring框架不仅负责创建,还负责将对象存储到bean池中
    
  • 2)prototype:多例作用域-此作用域对象为何时何时创建,spring框架只负责创建不负责销毁,一般可应用于不可重用对象、线程不安全的对象,或者说只是用一次就不再使用此对象了,这样的对象就可以被设计为多例作用域
    

SpringBoot 2.x 工程下的测试类的特点?

  • 1)包结构得是启动类所在包或者子包
  • 2)注解描述(@SpringBootTest)

SpringBoot 2.x 工程下的单元测试方法的特点?

  • 1)单元测试方法使用@Test注解(org.junit.jupiter.api.Test)进行描述
  • 2)单元测试方法不能使用private访问修饰符
  • 3)单元测试方法返回值只能是void类型
  • 4)单元测试方法不允许写方法参数
  • 5)单元测试方法允许抛出异常

@PostConstruct 此注解描述的方法为生命周期初始化方法,在这样的方法中一般会为创建好的对象再进行一些初始化

@PreDestroy 此注解描述的方法为生命周期销毁方法,此方法会在对象销毁之前执行,在这样的方法中可以实现一些资源销毁操作

package com.cy.pj.common.pool;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

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;
@Scope
@Lazy
public class ObjectPool {
	public int size;
	public ObjectPool() {//构造方法执行了,说明对象创建了
		System.out.println("ObjectPool()");
    }
    @PostConstruct
	public void init() {
		System.out.println("init()");
	}
    @PreDestroy
	public void destroy() {
		System.out.println("destroy()");
	}
}

其中:

  • @Scope 是Spring中用于定义Bean对象作用域的一个注解,其常用的值有

singleton(整个内存有一份Bean实例,此实例何时创建与类的延迟加载特性配置有关,此实例创建以后,生命周期会由spring框架管理),prototype(每次获取都会创建新实例,此实例会在需要时创建与lazy特性无关,这个实例创建以后,不会交给spring管理,spring可以对其初始化,但不负责销毁。)等。

  • @Lazy注解用于描述类,其目的是告诉spring框架此类支持延迟加载,通常会配合单例作用域使用。
  • @PostConstruct 注解用于描述bean对象生命周期方法中的初始化方法,此方法会在对象的构造方法之后执行。(是对象创建以后的初始化)
  • @PreDestroy 注解用于描述Bean对象生命周期方法中的销毁方法,此方法会在对象销毁之前执行(当作用域为prototype时,此方法不会执行)。

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

package com.cy.pj.common.pool;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class ObjectPoolTests {
	@Autowired
	private ObjectPool objectPool1;
	
	@Autowired
	private ObjectPool objectPool2;
	
	@Test
	void testObjectPools() {
		System.out.println("objectPool1="+objectPool1);
		System.out.println(objectPool1==objectPool2);
		objectPool1.size=10;
		System.out.println(objectPool2.size);
	}
}

面试题:spring框架管理Bean对象有什么优势吗?

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

@Autowired注解描述属性时,系统底层会基于属性类型从spring容器查找对象,

  • 假如有多个类型都满足注入要求,则还会基于属性进行查找,检测哪个bean名字与属性名相同,假如有相同的则直接去相同进行注入,没有则抛出异常

7. 项目业务增强实现及测试

第一步:定义业务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;

import org.springframework.stereotype.Component;

@Component // bean对象默认名字为类名,首字母小写
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注解配合@Autowired注解使用,用于
	//指定将哪个bean的名字对应的对象注入给描述的属性(例如cache属性)
	@Qualifier("softCache")
	private Cache cache;
	
	@Test
	void testCache() {
		System.out.println("cache="+cache);
	}
}

业务测试运行原理分析,如图-18所示:012


思考:

  1. @Autowired注解的应用规则?

  2. @Qualifier注解的作用是什么?

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

Springboot入门小结

1. 重难点分析

  • spring boot是什么?(脚手架而非框架)
  • spring boot核心优势?(启动依赖、自动配置-开箱即用、健康检查-系统监控)
  • spring boot的创建方式?(三种:基于sts创建、start.spring.io官网创建、maven)
  • spring boot项目启动时,Bean的初始化过程时怎样的?(查找–》加载–》读取和存储配置–》创建和存储实例对象)
  • spring boot项目启动时,Bean对象的依赖注入时怎样的?(标记、查找、注入)

2. FAQ分析

  • Maven工具(项目构建工具)从哪里下载?(maven.apache.org)
  • STS(集成了spring插件的eclipse)工具从哪里下载?(Spring.io/tools)
  • STS新版本怎么安装(例如STS4.5.0的安装可使用:java -jar xxx.jar)
  • 创建spring starter项目时pom.xml文件错误(工具版本(4.2以后无需考虑)、maven私服、本地库、maven update、网络)
  • Spring boot项目中支持的配置文件后缀有哪些?(.properties,.yml)
  • Spring boot启动类的包扫描位置?(启动类所在包以及子包)
  • Spring boot项目中可以有多个启动类吗?(不可以)
  • 如何理解Spring框架?(资源整合框架,科学应用现象-资源,低耦合)

.apache.org)

  • STS(集成了spring插件的eclipse)工具从哪里下载?(Spring.io/tools)
  • STS新版本怎么安装(例如STS4.5.0的安装可使用:java -jar xxx.jar)
  • 创建spring starter项目时pom.xml文件错误(工具版本(4.2以后无需考虑)、maven私服、本地库、maven update、网络)
  • Spring boot项目中支持的配置文件后缀有哪些?(.properties,.yml)
  • Spring boot启动类的包扫描位置?(启动类所在包以及子包)
  • Spring boot项目中可以有多个启动类吗?(不可以)
  • 如何理解Spring框架?(资源整合框架,科学应用现象-资源,低耦合)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值