目录
1.引言
1.1Spring 传统项目分析
在传统的spring应用项目中:
- 配置相对复杂(大量的xml)
- 依赖冲突严重(maven依赖版本不同)
- 扩展相对复杂
- 思考: 如何让初级程序员从复杂的配置中解脱出来,把更多的精力用于实现业务上呢?
Spring诞生于2002年,成型于2003,目前已经发展到了Spring5.x版本,支持JDK-11及JavaEE8。现在的spring已经不仅仅是framework,还扩展了spring boot,spring cloud等。
说明:学技术一定要了解技术发展史,并对技术的发展有一定的前瞻性。
1.2Spring 家族技术发展
Spring诞生于2002年,成型于2003,目前已经发展到了Spring5.x版本,支持JDK-11及JavaEE8。现在的spring已经不仅仅是framework,还扩展了spring boot,spring cloud等。
说明:学技术一定要了解技术发展史,并对技术的发展有一定的前瞻性。
1.3Spring Boot 概述
现在软件市场已经形成一定的规模,系统从单体架构,分布式架构,再到微服务架构,其整个架构体系正在发生很大变化,企业现在更注重技术的开箱即用,更注重技术在生态圈中的深度融合,更注重轻量级的运维。由此spring boot诞生。
1.4Spring Boot 核心特性
Spring boot是一个脚手架(而非框架),构建于Spring框架(Framework)基础之上,基于快速构建理念,提供了自动配置功能,可实现其开箱即用特性(创建完一个基本的项目以后,可零配置或者少量配置即可运行我们的项目),其核心主要有如下几个方面:
- 起步依赖(Starter Dependency)。
- 自动配置(Auto Configuration)。
- 健康检查(Actator)-监控。
其中,Spring Boot官方地址为https://spring.io/projects/spring-boot。
2.Spring Boot 快速入门
2.1初始环境配置
2.1.1 准备工作
- 工具下载
- 下载JDK1.8,并进行环境变量配置。
- 下载maven(例如apache-maven-3.6.3,网址http://maven.apache.org/),并进行相关配置(本地库,私服)。
- 下载sts最新版(例如sts-4.4.2.RELEASE,网址https://spring.io/tools)。
- 工作区准备
- 定义新的工作区(要求没有中文目录),例如d:/workspacests。
2.1.2 Maven基本配置
打开maven中的setting.xml文件,并对其如下选项进行配置。
- 配置maven本地库,
<localRepository>${user.home}/maven/repository</localRepository>
- 配置maven私服。
<mirror>
<id>aliyun</id>
<name>aliyun Maven</name>
<mirrorOf>*</mirrorOf>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
- 配置maven中的profile。
<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.1.3 STS整合maven配置
- Maven Installations配置, 如图-1所示:
- Maven User Settings配置:
- 项目工作区编码设置 :
2.1.4 STS工具使用基本优化
- 禁用拼写检查,取消所示的拼写检查选项:
- 取消所示的连接选项配置:
- 关掉校验功能:
- 修改STS工具内存配置,打开SpringToolSuite4.ini文件,修改堆大小,如图所示:
2.2项目创建及结构分析
基于STS 集成开发工具,创建spring boot项目,其具体步骤如下:
第一步:打开项目新建窗口(快捷键 ctrl+n), 搜索spring,选择spring starter 项目。如图所示:
第二步:填写项目基本信息。如图所示:
第三步:选择Spring Boot版本,如图所示:
说明: 点击finish之后,项目便开始从maven配置中指定的私服服务器(例如阿里云的maven服务器)去下载起步依赖(SpringBoot项目中默认指定了项目启动时需要的一些jar包依赖),这个过程可能会比较耗时(网络最好不要用手机网络,会导致很多资源下载不下来),假如指定版本的springboot项目以前创建过,它会默认先从本地库查找,假如本地库没有,则从远程库去下载。
2.3项目业务初步实现及测试
业务描述:创建一个DefaultCache类然后交给spring 管理。
@Component
@Scope("singleton")
@Lazy
public class DefaultCache {
public Cache() {
System.out.println("cache()");
}
@PostConstruct
public void init() {
System.out.println("init()");
}
@PreDestroy
public void destory() {
System.out.println("destory");
}
}
其中:
- @Component 是spring中用于描述Bean类的一个注解
- @Scope 是spring中用于定义Bean对象作用域的一个注解,其中常用的值有 Singleton , Prototype;
Singleton(单例作用域,在整个内存中只有一份), Prototype(每次获取对象时都会创建新的实例,并不会由Spring容器帮我管理);
- @Lazy 注解用于描述类,其目的是告诉spring框架此类支持延迟加载!
- @PostConstruct 注解用于描述bean对象声明周期方法中的初始化方法,此方法会在对象的构造方法之后执行
- @PreDestory注解用于描述bean对象生命周期方法中的销毁方法,此方法会在对象销毁之前执行;
添加sringboot 测试类,进行bean的获取及测试。
@SpringBootTest
public class DefaultCacheTests {
@Autowired
private DefaultCache defaultCache;
@Test
public void testCache() {
System.out.println(defaultCache);
}
}
其中:
@SpringBootTest注解用于告诉spring框架,此测试类交给spring管理
@Autowired注解用于描述属性或相关的方法(例如set方法,构造方法等),用于告诉spring容器为指定属性赋值
面试题: 能说说Spring框架管理Bean对象有什么优势吗?
1).spring是一个资源整合框架,通过spring可以将很多资源(自己写的对象或第三方提供的对象,例如连接池,Mybatis等)整合在一起,然后进行科学应用,以便更好的对外提供服务;
那再说说怎么进行科学的应用的呢?
1).spring框架可以为由它管理的对象(Bean)提供懒加载策略(对象暂时用不到,则无需加载和实例化),作用域(例如singleton-频繁用时可以考虑内存中只有一份,prototype-使用次数少时可以用时创建,不用时销毁),生命周期方法(更好地实现对象的初始化和资源销毁),以实现对象对系统资源的有效使用,同时Spring框架还可以基于用户设计管理对象与对象的依赖关系,以降低对象与对象之间的直接耦合,提高程序的可维护性和可扩展性;
2.4 项目业务增强实现及测试
第一步:定义业务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{
}
第三步:修改DefaultCache,让此类也实现Cache接口,关键代码如下:
@Component
public class DefaultCache 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("defaultCache")
private Cache cache;
@Test
public void testCache() {
System.out.println(cache);
}
}
思考:
1).@Autowired注解应用规则
2).@Qualifier 注解的作用是什么?
@Autowired由spring框架定义,用于描述类中属性或相关方法。Spring框架在项目运行时假如发现由他管理的Bean对象中有使用@Autowired注解描述的属性或方法,可以按照指定规则为属性赋值(DI)。其基本规则是:首先要检测容器中是否有与属性或方法参数类型相匹配的对象,假如有并且只有一个则直接注入。其次,假如检测到有多个,还会按照@Autowired描述的属性或方法参数名查找是否有名字匹配的对象,有则直接注入,没有则抛出异常。最后,假如我们有明确要求,必须要注入类型为指定类型,名字为指定名字的对象还可以使用@Qualifier注解对其属性或参数进行描述(此注解必须配合@Autoired注解使用)。具体过程可参考图-1的设计进行自行尝试和实践。