1.SpringBoot是什么?
Spring boot是一个脚手架,构建于Spring框架(Framework)基础之上,基于快速构建理念,提供了自动配置功能,可实现其开箱即用特性(创建完一个基本的项目以后,可零配置或者少量配置即可运行我们的项目)
2.SpringBoot核心优势是什么?
- 起步依赖(Starter Dependency)-项目创建时底层帮你关联依赖。
- 自动配置(Auto Configuration)。
- 健康检查(Actator)-监控
3.SpringBot项目启动时,Bean的初始化过程是怎样的?
SpringBoot项目在启动时,首先基于启动入口类的注解描述,进行自动配置并扫描指定包以及自包中的类进行加载,然后检测类上是否有Spring框架中指定的注解描述(例如@Component,@Controller,@Service等),即查找,加载,读和存储配置,创建和存储实例对象。假如有,则将类交给Spring框架中的BeanFactory工厂接口的实现类对象,此工厂对象会基于反射创建Bean的实例假如指定了生命周期方法,还会调用生命周期方法,当实例创建以后,Spring框架还会基于类的作用域描述,将实例对象存储到不用作用域的容器中,以实现Bean对象的科学应用。如图所示:
XxxApplication表示启动类
Xxx.class表示磁盘中的字节码文件
BeanFactory为创建Bean的工厂
ApplicationContext为管理Bean对象的作用域的上下文对象
Map<String.Object>为存储个种作用域的容器
4.SpringBoot 项目启动时,Bean对象的依赖注入过程是怎样的?(标记,查找,注入)
如图:
在上图中描述了DefaultCacheTests类与DefaultCache类的关系,这两个类通过指定注解(@SpringBootTest,@Component)进行了描述,其意图是告诉spring框架这个两个类的实例的创建由Spring负责,并且由Spring框架基于@Autowired注解的描述完成DefaultCacheTests实例中有关DefaultCache类型的值的注入(DI)。
5.Spring 框架中的Bean对象有什么特性?(延迟加载,作用域,生命周期方法)
Spring框架可以为由它管理的对象(Bean)
- 提供懒加载策略(对象暂时用不到,则无需加载和实例化),
- Scope作用域(例如singleton-(单例)频繁用时可以考虑内存中只有一份,
prototype-(多例)使用次数少时可以用时创建,不用时销毁), - Lifecycle method生命周期方法(更好实现对象的初始化和资源销毁),以实现对象对系统资源的有效使用。
实现bean对象的有效管理。
同时Spring框架还可以基于用户设计 管理对象与对象的依赖关系,
以降低对象与对象之间的直接耦合,
提高程序的可维护性和可扩展性。
6.Spring 框架中单例(singleton)作用域对象特点,应用场景(频繁用)?
特点:保证一个类仅有一个实例,并提供一个访问它的全局访问点。并且由于实例是在 Instance 属性方法内部创建的,因此类可以使用附加功能(例如,对子类进行实例化),即使它可能引入不想要的依赖性。而且直到对象要求产生一个实例才执行实例化;这种方法称为“惰性实例化”。惰性实例化避免了在应用程序启动时实例化不必要的 singleton。
应用场景:需要回收重要资源(数据库连接等)的事宜配置为singleton,如果配置为prototype需要应用确保资源正常回收。
- Windows的Task Manager(任务管理器)就是很典型的单例模式
- windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
- 网站的计数器,一般也是采用单例模式实现,否则难以同步。
- 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
- Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。
- 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。
- 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。
- 操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。
9. HttpApplication 也是单位例的典型应用。熟悉ASP.Net(IIS)的整个请求生命周期的人应该知道HttpApplication也是单例模式,所有的HttpModule都共享一个HttpApplication实例.
总结以上,不难看出:
单例模式应用的场景一般发现在以下条件下:
(1)资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。
(2)控制资源的情况下,方便资源之间的互相通信。如线程池等。
7.Spring 框架中多例(prototype)作用域对象特点,应用场景(稀少用)?
特点:prototype访问一次创建一个实例,相当于new。
与singleton区别:singleton的生命周期由容器来管理,但是prototype的生命周期得你自己管理
应用场景:有状态的Bean(比方说MVC中的action)配置成singleton会引发未知问题,可以考虑配置为prototype。
FAQ?
- Maven工具(项目构建工具)从哪里下载?(maven.apache.org)
- STS(集成了spring插件的eclipse)工具从哪里下载?(spring.io/tools)
- STS新版本怎么安装?(例如STS4.5.0的安装可使用:java -jar xxx.jar)
- 创建spring starter 项目时pom.xml文件错误?(maven私服,本地库,maven update,网络)
- Spring Boot项目中支持的配置文件后缀有哪些?(.properties,.yml)
- SpringBoot 启动类的包扫描位置?(启动类所在包以及子包)
- SpringBoot项目中可以有多个启动类吗?(不可以)
- 如何理解Spring框架?(资源整合框架,科学应用对象-资源,低耦合)
Spring管理bean对象时有什么优势?(为bean赋予了更加高级的特性,懒加载,单例作用域,生命周期方法)
- Spring 框架中@Autowire注解描述属性时,依赖注入的规则是怎样的?
- Spring 框架学习过程中学到了什么思想?(IOC,DI,池,低耦合,....)
IOC的理解:控制反转的容器。把对象的获取的主动权交出去
DI: 依赖注入,通过在构建bean对象的时候,把数据加入到对象中,所谓的依赖的意思就是这里的数据有可能是通过其它的bean对象得到的。 - Spring容器中bean名字不同,但类型相同的单例作用域配置可以有多个实例吗?
1、使用@Qualifier注解 指定具体bean名称
2、使用@Primary注解 在声明bean的时候,通过将其中一个可选的bean设置为首选
BUG分析
*Maven项目的setting文件配置错误
- 创建项目时网络连接超时
- Maven项目的pom.xml文件报错
- 空指针异常(NullPointerException-NPE)
- 依赖注入失败
- 找不到对应的Bean对象
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。