浅谈SpringBoot(一)

浅谈SpringBoot

目的

目前正在学Spring和SpringBoot,打算写一篇博客来记录自己学习的日常,有什么错误的地方希望大家可以积极指出,我们一起共同进步

一.什么是Springboot

SpringBoot最核心的作用就是简化spring工程的创建,配置,运行和维护。我们都知道Spring框架的存在是为了简化java开发,Spring本质就是帮我们创建对象以及维护对象之间的关系。但是Spring框架在使用时会配置很多东西,因此我们可以使用Springboot来简化spring的配置,仅需几步就可以搭建一个项目,将更多的时间用来写代码,

2.SpringBoot的优势

a.).简化Spring工程的配置,运行和维护
<1>起步依赖------项目创建以后会自动添加一些项目环境的基础依赖
<2>基础配置-------Spring项目中需要的基础配置都已经有了,例如bean的扫描,基础bean的作用域配置
b.)健康监控----对项目启动,运行时会有一个监控
c.)内置web服务----例如tomact-----可以使用嵌入式服务器运行你的项目

3.SpringBoot启动过程简析


1.通过@SpringbootApplication注解,Spring会扫描配置文件生成IOC容器对象
2.底层会通过线程的方式,以IO流的形式将代码从磁盘加载到内存中
3.对类进行分析(创建字节码对象–class类型,通过反射获取器配置信息)
3.IOC容器对象会根据@Component/@Srivice/@Controller/@RestController读取配置文件,将他们以Map的形式放到存储spring配置信息容器中Map<String,BeanDefiniton>-----类似工厂里将产品的原材料分别放到对应的仓库中
4.BeanFactory根据BeanDefinition对象中class的配置创建bean的实例,并将他们存放到bean池中

---------------------------------------------------------------------------------------

二.项目的目录结构

在这里插入图片描述

三.通过IDEA创建SpringBoot项目

1.file->new project 在弹出的窗口选择Spring Initializr在这里插入图片描述
2.修改项目信息在这里插入图片描述
3.选择要导入的依赖(这里暂时不添加依赖)
在这里插入图片描述
4.选择文件的存入位置在这里插入图片描述
5.需要检查一下是否成功导入到maven(否则不会帮你自动下载依赖)—假如文件中有些依赖呈红色,可能是还没下载下来在这里插入图片描述
至此,一个简单的SpringBoot项目就创建完成了
在这里插入图片描述
我们来看看系统都为我们生成了哪些配置文件吧:
.DemoApplication:一个带有main方法的类,用于启动应用程序
.application.properties:一个空的 properties 文件,可以根据需要添加配置属性
.DemoApplicationTests:一个空的Junit测试类,用于测试东西
.pom.xml:Maven构建说明文件

四.测试SpringBoot

1.编写一个简单的HelloWorld类
@component注解表示将这个类扫描装配到IOC容器中
在这里插入图片描述
2.在测试类中
@Autoried注解:自动赋值
注解使用规则;首先基于属性类型从spring容器中查询其对象–如果只有一个则直接注入
如果希望为属性注入指定名字的bean对象,使用@Qualifier(“XXX”)注解
在这里插入图片描述
输出demoApplication的地址值在这里插入图片描述

五.SpringBoot项目运行时可能出现的问题

a)NoSuchBeanDefinitionException----检查类所在的包,类上的注解
b)NullPointerException-----检查调用方法或属性的对象的值
c)No Test Found Exception–检查单元测试的方法写的是否正确,例如是否使用了public修饰
d)ParameterResolutionException-------单元测试方法不能写参数
e)ClassNotFoundException----首先看一下是那个类没有找到,如果是第三方的应该是依赖没有取下来
f)unable to find @SpringBootConfiguration----检查是否有启动类,单元测试 类所在的包

六.Springboot中的对象特性分析

1.延迟加载@lazy

我们都知道,一个项目启动后,对象会默认会创建,可是如果这个对象占用内存很大,并且暂时还不会用到,将它创建出来势必会增加系统的能耗,这时我们可以用spring框架提供的延迟特性来阻止这种现象
代码示例:
在这里插入图片描述
想监测类是否被加载,可以通过jvm参数进行监测:参数为
-XX:+TraceClassLoading。
注意:延迟加载并不是延迟对类进行加载,而是在启动时,暂时不加载类的实例

2.对象作用域分析@scope(“singleton”)/@scope(“prototype”)

在实际的项目中内存中的对象有一些可能要反复应用很多次,有一些可能用完以后再也不用了或者说应用次数很少了。对于经常要重复使用的对象我可考虑存储到池中(例如交给spring框架进行管理),应用次数很少的对象那就没必要放到池中了,用完以后让它自己销毁就可以了。在Spring项目工程中为了对这样的对象进行设计和管理,提供了作用域特性的支持,具体应用:
在这里插入图片描述
其中,在上面的代码中,我们使用了@Scope注解对类进行描述,用于指定类的实例作用域。不写@Scope默认就是单例(singleton)作用域,这个作用域会配合延迟加载(@Lazy)特性使用,表示此类的实例在需要时可以创建一份并且将其存储到spring的容器中(Bean池),需要的时候从池中取,以实现对象的可重用。假如一些对象应用次数非常少,可以考虑不放入池中,进而使用@Scope(“prototype”)作用域对类进行描述,让此类的对象何时需要何时创建,用完以后,当此对象不可达了,则可以直接被GC系统销毁。

3.对象的生命周期方法

@PostConstruct和@PreDestroy
在这里插入图片描述

程序中的每个对象都有生命周期,对象创建,初始化,应用,销毁的这个过程称之为对象的生命周期。在对象创建以后要初始化,应用完成以后要销毁时执行的一些方法,我们可以称之为生命周期方法。在实际项目中往往一些池对象通常会定义这样的一些生命周期
方法(例如连接池)。

七.SpringBoot项目中的依赖注入过程分析

为了更好的理解SpringBoot的底层注入机制,首先进行一个案例API设计,如图:在这个案例中单元测试类CacheTest中定义一个Cache接口类型的属性,然后由Spring框架完成对cache属性的注入
在这里插入图片描述
1.定义一个Cache接口:在这里插入图片描述
2.定义接口的两个实现类:SoftCache和WeakCache
在这里插入图片描述
在这里插入图片描述
3.定义单元测试类:在这里插入图片描述

PS: 当使用@Autowired注解时,spring底层按什么规则为属性赋值?–反射

1)首先基于属性类型从Spring容器中查询其对象–如果只有一个则直接注入
2)假如我们希望为属性注入指定名字的bean对象,使用@Qualifier(“Xx”)

4。运行结果分析:可以看到,成功打印出了WeakCache对象的地址值在这里插入图片描述

另外两种为依赖注入的方式—set方法和构造方法赋值:如图

在这里插入图片描述
1.在CacheService类里获得SoftCache类的对象的地址值
在这里插入图片描述
1.在CacheService类里通过构造方法获得值(这一步和上面通过构造方法或得值作用都一样)

在这里插入图片描述
在测试类里给CacheService对象自动装配,然后调用CacheService对象的getCache()来获得SoftCache对象的地址值并输出在控制台上
在这里插入图片描述

八.总结:

1.我们定义的Bean放在什么包中会在项目启动时被加载??
答:必须在启动类包或子包中
2.如何判断我们写的类,在项目启动时被加载了??
答:借助JVM参数分析:-XX:+TraceClassLoading
3.spring工程中类被读到内存中是否会直接创建对象??
答:不确定,要看其配置(@Lazy描述的类不会在项目启动时就创建)
4.对象被创建的一个标识是什么??
答:构造方法执行了
5.Springboot工程什么对象适合延迟加载??
答:大对象,稀少用,启动后可能暂时用不到的
6.Springboot工程假如希望对类的实例进行重用,该如何配置??
设置Singleton作用域:
6.1)可以设置延迟加载特性
6,2)此Bean的实例可以存储到Bean池,让对象可以重用
6.3)单例对象在使用时要注意其线程安全
7.Springboot工程中Bean对象的依赖查找(Dl)和依赖注入(DI)
答:7.1)实际工作中我们不会把所有的业务都写到一个对象,因为每个对象都有自己的zhize
7.2)实际项目中对象会通过协同方式完成一个业务,这种协同就需要对象之间存在依赖
7.3)当对象中存在耦合关系(对象间存在依赖)时,最好由对象管理方完成对象注入,例如Spring
7.4)Spring中为对象类型的属性赋值时常用的注入策略是—1.直接为属性赋值 2.set方法赋值 3.构造方法赋值
8.为什么要将对象交给Spring管理??
答:我们程序中对象的运行有一个目标,第一解决业务问题,第二:要高效低耗的优化业务的执行
Spring框架虽然不会帮我们解决业务问题,但可以从对象运行时的性能方面给予一定的设计,例如spring为我们的对象赋予了很多个更加科学的特性,例如延迟加载,作用域,生命周期方法时的自动依赖注入(降低耦合,提高程序的可维护性)
9.Spring框架中借助什么方式创建Bean对象??
通过反射
9.1)获取类的字节码对象(class类型–类加载到内存时就可以获取)
9.2)获取类中的构造方法对象(Constructor类型)
9.3)基于(Constructor)类型的对象创建对应类的实例(底层调用newInstance方法)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值