Day03 SpringBoot 工程与特性笔记

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()");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值