一.Spring boot 约定优于配制?
对于这个问题从四个方面回答
(1)约定优于配制是一种软件设计的范式,它的核心思想是减少软件开发人员对于配制项的维护,从而让开发人员更加聚焦在业务逻辑上。
(2)Spring boot就是约定优于配制的一个产物,它类似与spring框架下的一个脚手架,通过springboot我们可以快速开发一个基于spring的一个应用程序。
(3)基于传统的spring框架下开发web应用的时候我们需要做很多和业务无关并且只需要做一个次的配制项 例如1.管理jar包的依赖2.web.xml的维护3.Dispatch-Servlet.xml4.应用部署到web5.第三方组件集成IOC.而在springboot中我们不需要再去做这些繁琐的配制,因为springboot已经帮我们完成了,而完成这一个动作的前提就是基于约定优于配制的这一个思想。springboot约定优于配制的体现有很多 1.springboot-starter启动依赖它能够帮助我们管理所有的jar包版本2.如果当前应用依赖于web这个jar包他会内置一个tomcat容器来去运行web应用我们不再需要单独取部署3.springboot自动装配的机制中通过扫描约定路径下的spring.factories文件去进行识别配置类从而去实现bean的自动装载
(4)springboot默认会加载resource目录下的application.properties文件
总的来说约定优于配制是一个比较常见的软件设计思想他的核心本质都是为了去更加高效以及更加便捷的去实现软件系统的开发和维护
二.如何去理解springboot中的Starter?
Starter这个组件是springboot中四大核心特性之一除此之外springboot中还有自动装配,Actuator监控等这些特性都是为了让开发者开发基于spring生态下的的企业级应用的时候只需要关心业务逻辑减少对配制和外部环境的依赖。(1)Starter组件是以功能为维度来维护对应jar包功能的版本依赖开发者就不需要关注这些版本冲突这种容易出错的细节(2)Starter组件会把对应功能所有的jar包依赖全部导进来,避免开发者自己去引入依赖带来的一些麻烦(3)Starter组件内部集成自动装配这一个机制也就是说程序依赖Starter组件之后,这个组件会自动集成到spring生态里,并且对于相关bean管理也是基于自动装配来完成后的(4)依赖Starter组件之后这些组件的对应的功能所需要的外部化配制会自动集成到springboot中我们只需要在application.properties文件中进行维护配制就好了比如说redis这个starter只需要在application.properties文件中去维护redis这个链接信息就可以直接使用,在我看来Starter组件完美体现了约定优于配制这个理念,springboot官方提供了很多Starter组件但是官方不一定能去维护所有的Starter组件所以对于不存在的Starter组件,第三方会自己去维护这样一个组件,Starter组件和第三方Starter组件最大的区别就是命名方式,官方维护的Starter组件是
spring-boot-starter-xxx,第三方是xxx-spring-boot-starter.
三.接口和抽象类的区别是什么?
(1)抽象类中的成员变量可以是各种类型 但是接口中的成员变量默认为 public static final 类型。
(2)抽象类可以存在普通成员函数,接口中只能存public abstract方法
(3)抽象类只能继承一个,接口可以继承多个
(4)接口的设计目的是对类的行为进行约束,也就是提供一种机制可以强制不同的类具有相同的行为,它只约束了行为的有无,但不对如何实现进行限制。
(5)抽象类的设计目的 是为了代码的复用 当不同类具有相同的行为也就是说有一些共性的东西这时候就可以把这些共性的东西抽象出来就会派生出来所以说抽象类一定先有子类然后把子类的共性抽象出一个父类,但是这里有些方法是没有实现的所以不能实例化。
(6)接口是对行为的抽象,接口的核心是定义行为,即实现类是可以做什么,至于实现类主体是谁,怎么实现的接口并不关心
四.sleep()和wait() 有什么区别?
对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类
中的。
sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持
者,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象
锁。
当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用
notify()方法后本线程才进入对象锁定池准备,获取对象锁进入运行状态。
五.volatile 是什么?
volatile 是 Java 虚拟机提供的轻量级的同步机制(三大特性)
(1)保证可见性
(2)不保证原子性
(3)保证有序性(禁止指令重排)
性能:volatile 修饰的变量进行读操作与普通变量几乎没什么差别,但是写操作相对慢一些,因为需要在本地代码中插入很多内存屏障来保证指令不会发生乱序执行,但是开销比锁要小
synchronized 无法禁止指令重排和处理器优化,为什么可以保证有序性可见性
加了锁之后,只能有一个线程获得到了锁,获得不到锁的线程就要阻塞,所以同一时间只有一个线程执行,相当于单线程,由于数据依赖性的存在,单线程的指令重排是没有问题的
线程加锁前,将清空工作内存中共享变量的值,使用共享变量时需要从主内存中重新读取最新的值;线程解锁前,必须把共享变量的最新值刷新到主内存中
下一篇:有打折的礼物