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)
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)
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](https://i-blog.csdnimg.cn/blog_migrate/1f021e5c2c4bb78f8e92338334d1874e.png)
- JRE System Library建议配置jdk目录下的jre
5.SpringBoot工程启动过程(了解)
思考:SpringBoot工程在启动时会做些什么?
- 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 lookup Dependency injection 依赖查找 依赖注入
第四步:为对象设置作用域,设置延迟加载(又称按需加载),设置生命周期方法
- 一般情况下,只有在配置类种才会用@Bean去描述方法(SpringBootConfiguration),且这种方法一般适用于整合第三方资源。
- 加入一个注解只有value,那么value可以直接省略(例如@Lazy(value=true)可以写成@Lazy(true))
- 为什么要将对象交给Spring去创建–
- 延迟加载
- 可以为bean设置作用域
- 可以为bean设置声明周期
-
可能的bug
假设此对象为一个对象池
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框架还可以基于用户设计管理对象的依赖关系,以降低对象与对象之间的直接耦合,提高程序的可维护性和可扩展性。
@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所示:
思考:
@Autowired注解的应用规则?
@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框架?(资源整合框架,科学应用现象-资源,低耦合)