动力节点王鹤springboot3视频笔记第二章
SpringBoot同时提供“开箱即用”,“约定优于配置”的特性。
Spring Boot理念“约定优于配置”,也可称为按约定编程
Spring框架:Spring Boot创建的是Spring应用,对于这点非常重要。也就是使用Spring框架创建的应用程序。这里的Spring是指 Spring Framework。 我们常说的Spring,一般指Spring家族,包括Spring Boot、Spring Framework 、Spring Data ,Spring Security,Spring Batch , Spring Shell, Spring for Apache Kafka ....。
2004年3月,Spring Framework1.0发布。2006年10 月,Spring Framework2.0发布。2006年后开始,国内项目渐渐的开始应用Spring框架,2009年12月,Spring3.0发布。这时国内已经比较注重Spring使用了。项目多数转移到Spring框架了。 我是在2007开始知道渐渐了解Spring框架。 那个时候用Struts或者就是jsp+servlet+jdbc比较多。当时研发项目也没什么烦恼, 就一,两个技术可以用。没什么可选择的。现在的框架,技术太多了。2017 年 09 月,Spring Framework5.0 发布。 2022年11月Spring Framework6.0发布。第一个版本1.0的blog:https://spring.io/blog/2004/03/24/spring-framework-1-0-final-released
Spring Boot在现在Java开发人员必须掌握的框架。Spring Boot是掌握Spring Cloud的基础。
微服务:微服务(Microservices Architecture)是一种架构和组织方法,微服务是指单个小型的但有业务功能的服务,每个服务都有自己的处理和轻量通讯机制,可以部署在单个或多个服务器上。
微服务看做是模块化的应用,将一个大型应用,分成多个独立的服务,通过http或rpc将多个部分联系起来。请求沿着一定的请求路径,完成服务处理。
学习Spring Colud难度比较大,里面框架,工具比较多。有多个框架需要学习,在把框架组合起来又是一个难度。
伴随着Spring Boot3的发布,还有 Spring Framework 6.0的发布(2022-11-16),先于Spring Boot发布。
学习框架:我的建议无基础,先看视频,照着例子做;有基础后自己做点程序。之后看图书,最好是官网文档。不建议开始就看源代码。
有基础的:看图书,最好是官网文档,边看文档边实践。可以看框架此处功能的源代码。不建议通篇看源代码(在巨人身上是看不到全貌的)。提高部分看开源项目的代码,最后写项目。
脚手架是一种用在建筑领域的辅助工具,是为了保证建筑施工过程顺利进行而搭设的工作平台。软件工程中的脚手架是用来快速搭建一个小的可用的应用程序的骨架,将开发过程中要用到的工具、环境都配置好,同时生成必要的模板代码。脚手架辅助创建程序的工具,Spring Initializr是创建Spring Boot项目的脚手架。快速建立 Spring Boot项目的最好方式。他是一个web应用,能够在浏览器中使用。IDEA中继承了此工具,用来快速创建Spring Boot项目以及Spring Cloud项目。Spring Initializr脚手架的web地址:https://start.spring.io/阿里云脚手架:https://start.aliyun.com/
创建Spring Boot工程 Lesssion02-Project , Lession03-Project。脚手架使用需要联网。
2.3.1.4 spring-boot-starter-parent
[if !supportLists]· [endif]JDK的基准版本,比如<java.version>17</java.version>
[if !supportLists]· [endif]源码使用UTF-8 格式编码
[if !supportLists]· [endif]公共依赖的版本
[if !supportLists]· [endif]自动化的资源过滤:默认把src/main/resources目录下的文件进行资源打包
[if !supportLists]· [endif]maven的占位符为‘@’
[if !supportLists]· [endif]对多个Maven插件做了默认配置,如maven-compile-plugin,maven-jar-plugin
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
</dependencies></dependencyManagement>
[if !supportLists]· [endif]开发工具,例如IDEA 执行main方法
[if !supportLists]· [endif]Maven插件 mvn spring-boot:run
[if !supportLists]· [endif]java -jar jar文件的路径
Spring Boot项目可以打包为jar或者war文件。 因为Spring Boot内嵌了web服务器,例如tomcat。能够以jar方式运行web应用。 无需安装tomcat程序。
目录BOOT-INF : 应用的class和依赖jarMETA-INF: 清单
org.springframework.boot.loader: spring-boot-loader模块类
目录class:应用的类lib:应用的依赖没有BOOT-INF
spring-boot-loader执行jar的spring boot类没有此部分
命令:powershell中 tree /FSpring Boot jar文件的结构:
starter是一组依赖描述,应用中包含starter,可以获取spring相关技术的一站式的依赖和版本。不必复制、粘粘代码。通过starter能够快速启动并运行项目。starter包含:
[if !supportLists]1. [endif]依赖坐标、版本
[if !supportLists]2. [endif]传递依赖的坐标、版本
[if !supportLists]3. [endif]配置类,配置项
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
[if !supportLists]· [endif]大小写敏感
[if !supportLists]· [endif]使用缩进表示层级关系
[if !supportLists]· [endif]缩进只可以使用空格,不允许使用Tab键
[if !supportLists]· [endif]缩进的空格数目不重要,相同层级的元素左侧对齐即可
[if !supportLists]· [endif]#字符表示注释,只支持单行注释。#放在注释行的第一个字符YAML缩进必须使用空格,而且区分大小写,建议编写YAML文件只用小写和空格。
[if !supportLists]· [endif]对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
[if !supportLists]· [endif]数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
Spring Boot同时支持properties和yml格式的配置文件。 配置文件名称默认是application。我们可以使用application.properties , application.yml。读取配置文件的key值,注入到Bean的属性可用@Value,@Value一次注入一个key的值。将多个key值绑定到Bean的多个属性要用到@ConfigurationProperties注解。在代码中访问属性除了注解,Spring提供了外部化配置的抽象对象Environment。Environment包含了几乎所有外部配置文件,环境变量,命令行参数等的所有key和value。需要使用Environment的注入此对象,调用它的getProperty(String key)方法即可。
创建新的Spring Boot练习配置文件的使用,项目名称 Lession07-config。Maven作为构建工具,JDK19。包名com.bjpowernode.config 。不需要其他依赖。
2.6.1.3 application.properties
step2: 创建SomeService类读取app.name, app.owner,app.port配置key。注解@Value读取单个值,语法${key:默认值}
step3:单元测试在test目录下创建测试类,注入SomeService对象,调用它的printValue()方法。
@SpringBootTest public class TestPropConfig {
输出:result = Lession07;changming;8001
step2: 运行单元测试TestPropConfig#test01()输出:result = Lession07-yml;bjpowernode;8002
step1:创建ReadConfig类,注入Environment
@Autowired private Environment environment;
String name = environment.getProperty("app.name");
if (environment.containsProperty("app.owner")) {
System.out.println("有app.owner配置项");
Integer port = environment.getProperty("app.port", Integer.class, 8000);
String result = String.format("读取的name:%s,端口port:%d", name,port);
System.out.println("result = " + result);
private ReadConfig readConfig;
输出:有app.owner配置项result = 读取的name:Lession07-yml,端口port:8002
step1:在resources创建自定义conf目录,在conf中创建redis.yml, db.yml
public class MultiConfigService {
@Value("${spring.redis.host}")
@Value("${spring.datasource.url}")
System.out.println("redis的ip:"+redisHost+",数据库url;"+dbUrl);
class MultiConfigServiceTest {
private MultiConfigService multiConfigService;
multiConfigService.printConfig();
输出:redis的ip:192.168.1.10,数据库url;jdbc:mysql://192.168.1.21/db?serverTime=Asia/Shanghai
public class MulitEnvService {
private MulitEnvService service;
void test01() {service.print();
使用之前的app开头的配置内容。yml,properties配置格式都可以,绑定Bean的效果都一样。step1:查看application配置。目前使用的是application.yml
step2: 创建Bean,定义name,owner, port属性
security:username: commonpassword: abc123
输出:security = Security{username='common', password='abc123'}
Map,List以及Array都能提供配置数据, 下面通过一个示例配置集合属性。
step2: 修改application.yml, 配置数据
“-”表示集合一个成员,因为成员是对象,需要属性名称指定属性值。List与数组前面加入“-”表示一个成员。Map直接指定key和value,无需“-”。
com.bjpowernode.config.pk5是新增的包, 按自己的包结构指定名称。
需求:一个组织信息,在单独的properties文件提供组织的名称,管理者和成员数量
step2:在resources目录下的任意位置创建properties文件,我们创建group-info.properties,放在resources根目录。
控制台输出:group = Group{name='IT学习专栏', leader='无名', members=500}
总结:@ConfigurationProperties绑定Bean对于使用配置文件的数据是十分方便,灵活的。也支持对数据的校验,校验是JSR303规范中的注解。Bean定义结合Lombok会更加方便。如果团队都接受Lombok。 推荐使用。
[if !supportLists]· [endif]传统的XML配置文件
[if !supportLists]· [endif]Java Config技术, @Configuration与@Bean
[if !supportLists]· [endif]创建对象的注解,@Controller ,@Service , @Repository ,@Component
Spring Boot不建议使用xml文件的方式, 自动配置已经解决了大部分xml中的工作了。如果需要xml提供bean的声明,@ImportResource加载xml注册Bean。
需求:XML配置Spring容器。声明Beanstep1: 创建Person类,对象由容器管理
public class Person {private String name;private Integer age;//set | get ,toString}
@ImportResource(locations = "classpath:/applicationContext.xml"), 加载类路径下的applicationContext.xml文件。location或者value属性都能指定文件路径。
[if !supportLists]· [endif]Aspect:表示切面,开发自己编写功能增强代码的地方,这些代码会通过动态代理加入到原有的业务方法中。@Aspect注解表示当前类是切面类。 切面类是一个普通类。
[if !supportLists]· [endif]Joinpoint:表示连接点,连接切面和目标对象。或是一个方法名称,一个包名,类名。在这个特定的位置执行切面中的功能代码。
[if !supportLists]· [endif]Target Object: 目标对象。 在A类的print()方法执行前, 输出方法的执行时间。 也就是给A这个对象增加了“输出执行时间的功能”。
step2:创建业务类SomeService在aop的service子包
@Aspect说明当前类是切面类,包含了功能增强的代码和通知注解。@Component 将切面类对象注入到spring容器。spring会根据目标类和切面类创建代理对象,织入切面功能。