Day03-01 知识回顾
1.在IDEA中通过Git将我们的项目push到Gitee平台
1)两种方式(没有仓库-share,已有仓库-push)
2)常见问题(FAQ)分析
2.1)push过程被拒绝(账号不正确或者mail是隐藏账号,仓库名不遵守规则,push时远端仓库有readm)
2.2)push之前我们前面需要哪些Git操作(add.commit)
2.3)这里push时能只push我们指定的项目模块吗?(不push的模块不要comment)
2.4)不同项目可以放到同一个远程仓库吗?(不可以),不同的项目不同的本地库,也会对应不同的远程仓库。
2.通过Git将远端项目克隆(Clone)到本地
1).克隆方式(通过idea中clone选项,通过Git Bash工具基于git clone指令)
2).常见问题分析(FAQ)分析
2.1)克隆下来的项目如何运行?(jdk,maven,rebuild,out,mark as source root)
2.2)克隆的项目可以指定新的名字吗?(可以)
2.3)直接使用git clone指令克隆下来的项目如何打开?(基于idea菜单中file/open选项)
3.IDEA中springboot项目的创建及结构分析
1).项目的创建(Spring lnitializr-旗舰版,Spring Assistant-社区版…)
2).项目结构分析(pom.xml,src/main/java,src/main/resources,src/test/java…)
3).项目启动过程分析?(thread/io->Disk->load memory->Class object->Read and Store Config–>BeanFactory–>Create instance)
Day03-02 springboot 工程业务实践初步分析
1.背景分析
Spring Boot工程中是如何对我们自己写的Class进行资源整合和应用的,他在哪些方面做了简化呢?
2.业务初步设计
1)创建业务类(例如DefaultCache)
2)将业务类交给Spring管理
3)从Spring中获得对象并进行应用测试
FAQ?
1)创建的业务类对包有要求吗?(需要放在src/java/main目录下,,启动类所在包或子包中)
2)我们的业务类在交给spring管理时需要如何描述?
3)为什么我们写类的实例要交给spring管理呢?
4)Springboot工程中的单元测试类编写时有什么要求?
4.1)目录:src/test/java
4.2)包:启动类所在包或子包(不是src/main/java目录)
4.3)注解:(@SpringBootTest,@Test-org.junit.jupiter)
5)如何理解项目中的Has a的关系?(依赖->包含->有一个->在类中有一个其它类型的属性)
6)类与类之间的关系我们可以从哪个几个方法着手进行入门理解?(is a,has a ,use a )
6.1) is a (extends,implements)
6.2) has a (有一个)
6.3) use a (使用)
Bug?
1)NullPointerException(NPE-空指针异常)
2)UnsatisfiedDependencyException(依赖注入异常)
3)NoSuchBeanDefinition(没有找到对应的Bean对象)
4)ParameterResolutionException(参数解析异常-单元测试方法添加参数)
5)…
3.总结(Summary)
通过这个业务入门应用,掌握了SpringBoot中我们自己写类该如何交给Spring管理,
并且理解了在运行过程中可能出现的一些问题及解决方案,同时意识springboot
工程为我们业务的实现所带来的一些便利(不用我自己关心依赖,没有做基础配置),
让我们更多的精力聚焦在了业务的实现上.
Day03-03 Spring Boot工程中Bean对象的核心特征
1.背景信息
对于计算机而言,“计算"是他要解决的一个最核心的问题?
那么如何让计算机更加的"高效"和"低耗”,这也是我们程序员在编程过程中要考虑的直接目标。
在spring工程中将对象交给spring管理,其目的也是让Spring赋予这些对象更多的科学特性,
进而让对象在内存中更加高效和低耗运行。
对于这些科学的特性又如何理解呢?
思考?
在程序中我们为什么要将对象交给spring管理呢?
Spring管理这些对象是有什么优势吗?
能够站在高效或者低耗的纬度提高计算机性能?
2.Spring中Bean的特性分析?
在Spring框架中为我们Bean对象赋予了很多科学特性,
例如:
(1)延迟加载(延迟对象创建)
(2)作用域(让对象存储在指定作用域中然后可以重复使用)
(3)生周期方法(对象在创建和销毁之前可以对对象进行一些初始化和资源销毁操作)
基于这些特性,可以让我们在sping工程中的对象可以更加高效的解决一些业务问题.
3.Spring 中Bean的特性应用实践?
(1)创建项目module
(2)构建一个对象池对象,其类型为ObjectPool
(3)通过单元测试类,对对象池进行测试分析
FAQ?
1.如何对池对象进行设计才能够更好的让池对象服务于我们的业务?(低耗、高效)
2.一般池对象的设计会应用到什么设计模式?(享元模式-重点设计在对象的重用上)
3.Spring中延迟加载指的是类暂时不加载到内存吗?(不是,类加载到内存后暂时不会创建类的实例)
4.Spring中的延迟加载对象的实例何时创建?(使用时)
5.Spring中的延迟加载特性重点要解决什么问题?(资源消耗问题)
6.Spring中对象作用域如何理解?(对象的一个应用范畴问题)
7.Singleton作用域的类,相同名字的实例在内存中只有一份,可以重用。
8.Singleton作用域的类,如何让其支持延迟加载特性?(使用@Lazy注解描述)
9.Prototype作用域的类默认支持延迟加载吗?(支持,默认就是使用时创建,无需使用@Lazy注解描述)
10.Prototype作用域的类的实例是每次从spring框架请求时都会创建吗?(会)
11.程序中的每个对象都有生命周期,但不一定都要定义生命周期方法?(正确)
package com.cy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class FeaturesApplication {
public static void main(String[] args) {
SpringApplication.run(FeaturesApplication.class, args);
}
}
2)作用域(让对象存储在指定作用域中然后可以重复使用)分析:
package com.cy.pj.common.pool;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
/**
* 假设这是一个对象池
* FAQ?
* 1)当项目的启动类在启动时会将此类加载到内存吗? 你怎么知道的?
* 答:会,但是有条件,包结构必须正确(可以通过JVM参数检测类是否被加载了: -XX:+TraceClassLoading)
* 2)项目的启动类在启动会默认创建ObjectPool类型的实例吗?
* 答:会的,可以通过构造方法进行校验。
* 3.思考,对于一个池对象而言,相对与普通对象占用的资源是多还是少?
* 答:多,但是这个对象暂时不适用。
* 又占用很多的资源是否会影响性能呢?
* 会
*/
//@Scope("singleton") //默认作用域为单例作用域,此作用域通常会配合延迟加载作用域,使用频率少
@Scope("prototype") //多例作用域,每次从spring请求类的实例都会创建新的对象,比较常用
//@Lazy //延迟加载 延迟对象的实例的创建,用的时候再去创建
@Component
public class ObjectPool {
public ObjectPool(){
System.out.println("ObjectPool");
}
}
package com.cy.pj.common.pool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class ObjectPool {
@Autowired
private ObjectPool objectPool01;
@Autowired
private ObjectPool objectPool02;
public ObjectPool(){
System.out.println(objectPool01 == objectPool02);//比较的作用域或连接池
System.out.println(objectPool01.equals(objectPool02));//return (this == obj);比较的地址
}
}
3)生周期方法(对象在创建和销毁之前可以对对象进行一些初始化和资源销毁操作)分析:
package com.cy.pj.common.pool;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
//@Scope("singleton") //默认作用域为单例作用域,此作用域通常会配合延迟加载作用域,使用频率少
@Scope("prototype") //多例作用域,每次从spring请求类的实例都会创建新的对象,比较常用
//@Lazy //延迟加载 延迟对象的实例的创建,用的时候再去创建
@Component
public class ObjectPool {
public ObjectPool(){
System.out.println("ObjectPool");
}
@PostConstruct //生命周期初始化方法,构造方法之后执行,可以在方法内部作用一些初始化
public void init(){
System.out.println("init()");
}
@PreDestroy //生命周期销毁方法,对象销毁之前执行,可以在对象销毁前做一些资源释放的操作
public void desotry(){
System.out.println("desotry()");
}
}