Android相关的知识点

341 阅读24分钟

Android相关的知识点

【题目】Android 6.0、7.0、8.0、9.0 、10.0新特性?

【6.0】动态权限、使用Builder模式来构建通知、取消了Apache HTTP客户端、相机Camera变更为Camera2.之前是先到先得,现在是按照优先级别使用、【7.0】权限更改;【8.0】通知(添加了对通知渠道的支持)、后台限制执行、运行时权限、安装未知应用的权限、悬浮窗【9.0】刘海屏适配、通知功能的变更、利用 Wi-Fi RTT 进行室内定位【10.0】存储权限、定位权限、设备唯一标识符等

【题目】Android 中的动画分类?

Frame Animation:逐帧动画,即顺序播放事先做好的图像,跟电影类似 。

Tween Animation:补间动画,通过对场景里的对象不断做图像变换 ( 平移(0,0) ->(100,100)、缩放、旋转 ) 产生动画效果。

Property Animation:属性动画,补间动画增强版,支持对对象执行动画。(0,0) -> (100,100)

Transition Animation:过渡动画,主要是实现Activity或View过渡动画效果。

【题目】你以前是如何进行屏幕适配的?

【题目】Android Log类基本用法

www.jianshu.com/p/c77032b3c…

【题目】说说 Activity 创建过程?

答:

【题目】介绍一下activity的生命周期(好好看一下)

**onCreate(Bundle savedInstanceState):**创建activity时调用。设置在该方法中,还以Bundle的形式提供对以前储存的任何状态的访问! onStart():activity变为在屏幕上对用户可见时调用。 onResume():activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。

onPause():activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧! onStop():activity被停止并转为不可见阶段及后续的生命周期事件时调用。 onRestart():重新启动activity时调用。该活动仍在栈中,而不是启动新的活动。

OnDestroy():activity被完全从系统内存中移除时调用,该方法被 2.横竖屏切换时候activity的生命周期

【题目】了解 fragment 吗?说说你对它的理解?

简单来说,Fragment可以理解为一个具有自己生命周期的控件,只不过这个控件又有点特殊,它有自己的处理输入事件的能力,有自己的生命周期,又必须依赖于Activity,能互相通信和托管。

1.主要目的是为了给大屏幕(如平板电脑)上更加动态和灵活的UI设计提供支持。由于平板电脑的屏幕比手机的屏幕大很多,因此可用于组合和交换的UI组件的空间更大,利用Fragment实现此类设计的时,就无需管理对视图层次结构的复杂更改。

2.代码复用。特别适用于模块化的开发,因为一个Fragment可以被多个Activity嵌套,有个共同的业务模块就可以复用了,是模块化UI的良好组件。

3.Activity用来管理Fragment。Fragment的生命周期是寄托到Activity中,Fragment可以被Attach添加和Detach释放。

4.可控性。Fragment可以像普通对象那样自由的创建和控制,传递参数更加容易和方便,也不用处理系统相关的事情,显示方式、替换、不管是整体还是部分,都可以做到相应的更改。

5.Fragments是view controllers,它们包含可测试的,解耦的业务逻辑块,由于Fragments是构建在views之上的,而views很容易实现动画效果,因此Fragments在屏幕切换时具有更好的控制。

【题目】自定义过 view 吗?它的步骤是什么?

自定义View三种方式,组合现有控件,继承现有控件,继承View

  • 自定义View属性:在res/values/下建立一个attrs.xml,用来自定义View的属性
  • 在View的构造方法中获得自定义的属性:重写CustomTitleView的构造函数,来获取自定义的属性
  • 重写onMesure
  • 重写onDraw:重写onDraw函数,根据读取到的自定义属性,绘制出相应的控件

specMode = EXACTLY :设置确定的数值或者说match_parent。

specMode = AT_MOST :将子布局限制为一个最大值内或者说warp_content。

specMode = UNSPECIFIED:表示子布局要多大就有多大,实际开发中比较少用。

重写onMesure方法主要是为了解决: 我们在使用自定义控件的时候,设置warp_content并没有按照适当缩放的效果显示出来,而是铺满显示,这个和我们预期的效果不一致。

【题目】简述 View 的绘制流程

www.jianshu.com/p/63e915c6c…

在activity的attach方法里面,会创建一个PhoneWindow。

在onCreate中调用setContentView,setContentViewwindow的一个抽象方法,真正实现类是PhoneWindow

 @Override
    public void setContentView(int layoutResID) {
        if (mContentParent == null) {

//1.初始化
        //创建DecorView对象和mContentParent对象 ,并将mContentParent关联到DecorView上
            installDecor();
        } else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
            mContentParent.removeAllViews();//Activity转场动画相关
        }

//2.填充Layout
        if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
            final Scene newScene = Scene.getSceneForLayout(mContentParent, layoutResID,
                    getContext());
            transitionTo(newScene);//Activity转场动画相关
        } else {
        //将Activity设置的布局文件,加载到mContentParent中
            mLayoutInflater.inflate(layoutResID, mContentParent);
        }

        //让DecorView的内容区域延伸到systemUi下方,防止在扩展时被覆盖,达到全屏、沉浸等不同体验效果。
        mContentParent.requestApplyInsets();

//3\. 通知Activity布局改变
        final Callback cb = getCallback();
        if (cb != null && !isDestroyed()) {

        //触发Activity的onContentChanged方法  
            cb.onContentChanged();
        }
        mContentParentExplicitlySet = true;
    }

核心方法就两个:installDecor() 和 mLayoutInflater.inflate(layoutResID, mContentParent) ;

installDecor会创建一个DecorView 对象,该对象将作为整个应用窗口的根视图。然后配置不同窗口修饰属性(style theme等)。

mLayoutInflater.inflate就是解析xml,深度优先地递归解析xml,一层层添加到root view上,最终返回root view.解析的部分大致包含两点:

1.解析出View对象

2.解析View对应的Params,并设置给View。

【题目】说说你自定义 view 过程中出现的问题,以及是如何解决的?

答:

【题目】Android刷新 view 的几种方式,他们有什么区别?

一:runOnUiThread;

二:handler post;

三:handler sendMessage;

四:view post;

【题目】所有的view都不可以在子线程更新
【题目】如何实现 Android 中的缓存的,通过使用第三方库和自定义来分别说明一下缓存技术的实现?
【题目】Android 的事件分发机制

www.jianshu.com/p/d3758eef1… www.jianshu.com/p/38015afcd… www.jianshu.com/p/555ffeb64…

View事件分发本质就是对MotionEvent事件分发的过程。即当一个MotionEvent发生后,系统将这个点击事件传递到一个具体的View上

点击事件的传递顺序:Activity(Window)→ViewGroup→ View

事件分发过程由三个方法共同完成:

  • dispatchTouchEvent:用来进行事件的分发。如果事件能够传递给当前View,那么此方法一定会被调用,返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent方法的影响,表示是否消耗当前事件
  • onInterceptTouchEvent:在上述方法内部调用,对事件进行拦截。该方法只在ViewGroup中有,View(不包含 ViewGroup)是没有的。一旦拦截,则执行ViewGroup的onTouchEvent,在ViewGroup中处理事件,而不接着分发给View。且只调用一次,返回结果表示是否拦截当前事件
  • onTouchEvent: 在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件
【题目】说说 Android view 和 viewGroup 的事件分发机制?
【题目】Handler内部实现原理?

Handler解决应用内的通信和管理;包含handler、Looper、Message、MessageQueue、thread

【题目】Android Handler机制原理浅析

www.jianshu.com/p/9b6f67c25…

在创建主线程时,会自动执行**ActiityThread类中的静态方法main(),而main()方法内部会调用Looper.prepareMainLooper()方法,为主线程创建一个Looper对象和一个MessageQueue对象, 然后调用Looper.loop()**消息循环方法取出消息

先获取 Looper对象, 然后获取 消息队列对象MesageQueue,再通过死循环,从消息队列中获取消息**queue.next(),拿到消息就分发给对应handler的方法dispatchMessage(Message msg);**

将发送消息加入到消息队列中,在加入前为消息对象Message的target属性设置指向当前的handler对象,在Looper.loop()取出消息队列中的消息,就可以找到对应的handler分发消息了.

【题目】一个线程有几个Handler?

多个;因为Handler可以在Activity中new,在Service里面也可以new,而Activity全部都跑在了主线程里面,这就证明了主线程中可以有多个Handler。

【题目】主线程Looper一直循环查消息为何没卡主线程?

通过查看ActivityThread的handleMessage的源码可以看出,Android是由事件驱动的,常见的触摸和Activity的生命周期都是运行在Looper.loop()的控制之下,如果该循环停止了,那么整个应用也停止了。

主线程中如果没有looper进行循环,那么主线程一运行完毕就会退出。那么我们还能运行APP吗,显然,这是不可能的,Looper主要就是做消息循环,然后由Handler进行消息分发处理,一旦退出消息循环,那么你的应用也就退出了。

【题目】一个线程有几个Looper?如何保证?

只有一个Looper;有一个ThreadLocal类,其中有一个ThreadLocalMap,因为一个线程跟一个ThreadLocalMap是绑定的,如果这个Map中存有当前Looper里的sThreadLocal为键的键值对,就不会再存储Looper,反而而会抛异常了,因为sThreadLocal在全局是唯一的。

【题目】ThreadLocal作用、场景、原理

ThreadLocal 是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,其他线程则无法获取。

**作用:**ThreadLocal是解决线程安全问题一个很好的思路,它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。

www.jianshu.com/p/6fc3bba12…

【题目】为什么ThreadLocalMap里面的Entry使用WeakReference声明?

**答:**为了方便回收;WeakReference对应用的对象userInfoLocal是弱引用,不会影响到userInfoLocal的GC行为。如果是强引用的话,在线程运行过程中,我们不再使用userInfoLocal了,将userInfoLocal置为null,但userInfoLocal在线程的ThreadLocalMap里还有引用,导致其无法被GC回收(当然,可以等到线程运行结束后,整个Map都会被回收,但很多线程要运行很久,如果等到线程结束,便会一直占着内存空间)。而Entry声明为WeakReference,userInfoLocal置为null后,线程的threadLocalMap就不算强引用了,userInfoLocal就可以被GC回收了。map的后续操作中,也会逐渐把对应的"stale entry"清理出去,避免内存泄漏。

【题目】Handler内存泄漏的原因?

**答:**对于Handler来说,如果我们直接在AndroidStudio中创建一个非静态内部类Handler,那么Handler这一大片的区域会被AS标记为黄色,这个应该很多人都遇到过吧。实际上是因为这样设置会造成内存泄露,因为每一个非静态内部类都会持有一个外部类的引用,那么这里也就产生了一个内存泄露的可能点,如果当Activity被销毁时没有与Handler解除,那么Handler仍然会持有对该Activity的引用,那么就造成了内存泄露。

**解决方法:**使用static修饰Handler,这样也就成了一个静态内部类,那么就不会持有对外部类的引用了。而这个时候就可以在Handler中创建一个WeakReference(弱引用)来持有外部的对象。只要外部解除了与该引用的绑定,那么垃圾回收器就会在发现该弱引用的时候立刻回收掉它。

【题目】为什么主线程可以new Handler,如果在子线程new Handler需要做些什么?

**答:**在ActivityThread.java里有一个main()函数,它是Android每一个应用最早执行的函数。

prepare是初始化,初始化了一个Looper。

然后又接着调用的Looper.loop()函数,这个loop()函数其实就是执行了那个for循环,它不断的调用next()函数,通过调用next()函数去轮询我们的MessageQueue。

如果不调用prepare(),Looper没有被初始化;如果不调用loop(),Looper的机制滚动不起来。所以,所有的执行必须先prepare(),然后再loop()。

因为主线程一启动的时候,在main()函数中,由系统已经帮我们完成了,我们主线程中的所有代码,全都运行在这两个函数(prepare() 和 loop())之间。

所有的线程都必须要prepare()和loop(),如果子线程中想要进行Handler操作,就必须在子线程中执行prepare() 和 loop()。

【题目】handler的post和postDelay是怎么做的

答:都可以用以在子线程中发送Runnable对象的方法;Android中post()方法可以直接在非UI线程中更新UI,不同与Handelr的Send类方法,需要进行切换;两个方法在实现UI线程事件的时间上有所区别,postDelayed()方法用以延期执行,post则是立即执行;

handler.postDelay() 的实现是通过MessageQueue中执行时间顺序排列,消息队列阻塞,和唤醒的方式结合实现的

【题目】使用过 AsyncTask 吗?说说它的内部实现原理?它有什么缺陷?如何改进?
【题目】什么是ANR?ANR发生的原因是什么?
  • 有四种情况会造成ANR发生:
  1. 5秒内无法响应屏幕触摸事件或键盘输出
  2. 在执行前台广播的onReceive()函数时10秒没有处理完成,后台为20秒
  3. 前台服务20秒内,后台服务在200秒内没有执行完成
  4. ContentProviderpublish在10s内没进行完
  • 如何避免:

尽量避免在主线程中做耗时操作。 多线程==>引出如何实现多线程,线程池的使用

  • 如何分析ANR:
  1. 产生anr之后,会在data/anr/目录下生成一个文件traces.txt
  2. Logcat中查看
  3. Java线程调用分析
  4. DDMS分析
【题目】知道 JNI、Binder 吗?说说你对它们的理解?

**答:**Binder是一种进程间通信机制, 采用C/S架构,Binder框架中主要涉及到4个角色Client、Server、Service Manager及Binder驱动,其中Client、Server、Service Manager运行在用户空间,Binder驱动运行在内核空间,Client代表客户端进程,Server代表客户端进程提供各种服务,如音视频等;Service Manager用来管理各种系统服务;Binder驱动提供进程间通信的能力

Binder IPC 机制中涉及到的内存映射通过 mmap() 来实现,mmap() 是操作系统中一种内存映射的方法。内存映射简单的讲就是将用户空间的一块内存区域映射到内核空间。映射关系建立后,用户对这块内存区域的修改可以直接反应到内核空间;反之内核空间对这段区域的修改也能直接反应到用户空间。

【题目】应用(APP)的启动方式分为两种:冷启动和热启动。

冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。

热启动:当启动应用时,后台已有该应用的进程(例:按home键回到桌面,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动。

www.jianshu.com/p/786c0de5a…

【题目】开始开发 APP 如何进行架构?

【题目】APP 工程模块是如何划分的?你是如何进行封装的?

【题目】APP 是如何进行优化的?

【题目】知道 OOM 吗?如何解决内存泄漏?

【题目】如何实现 Activity 与 fragment 的通信?

Activity 如何传递数据到Fragment: 采用 Bundle方式

Fragment 如何传递数据到 Activity:采用 接口回调 方式

【题目】了解 APP 的启动流程?

答:(1)启动的起点发生在Launcher活动中,启动一个app说简单点就是启动一个Activity,那么我们说过所有组件的启动,切换,调度都由AMS来负责的,所以第一步就是Launcher响应了用户的点击事件,然后通知AMS

(2)AMS得到Launcher的通知,就需要响应这个通知,主要就是新建一个Task去准备启动Activity,并且告诉Launcher你可以休息了(Paused);

(3)Launcher得到AMS让自己“休息”的消息,那么就直接挂起,并告诉AMS我已经Paused了;

(4)AMS知道了Launcher已经挂起之后,就可以放心的为新的Activity准备启动工作了,首先,APP肯定需要一个新的进程去进行运行,所以需要创建一个新进程,这个过程是需要Zygote参与的,AMS通过Socket去和Zygote协商,如果需要创建进程,那么就会fork自身,创建一个线程,新的进程会导入ActivityThread类,这就是每一个应用程序都有一个ActivityThread与之对应的原因;

(5)进程创建好了,通过调用上述的ActivityThread的main方法,这是应用程序的入口,在这里开启消息循环队列,这也是主线程默认绑定Looper的原因;

(6)这时候,App还没有启动完,要永远记住,四大组建的启动都需要AMS去启动,将上述的应用进程信息注册到AMS中,AMS再在堆栈顶部取得要启动的Activity,通过一系列链式调用去完成App启动;

【题目】你知道哪些图片加载库?他们有什么区别?

blog.csdn.net/u010312474/…

Gilde的优点 1、图片占用内存回收及时,能减少因内存不足造成的崩溃,生命周期和Activity/Fragment一致。 (重要的特性) 2、默认Bitmap格式是RGB_565,减少内存资源占用。 3、glide比universal-image-loader占用的内存要小一些。 4、图片显示效果为渐变,更加平滑。 5、glide可以将任何的本地视频解码成一张静态图片。 6、支持 Gif、WebP、缩略图

【题目】ImageLoader 的内部缓存机制是什么?是如何实现的?

Imageloader分为二级缓存:内存缓存和本地文件缓存(也有人说是三级缓存,第三级网络缓存。但是博主认为网络部分不应算在缓存部分。纯属个人意见请勿喷!) 这篇博文我就和大家一起来了解一下内存缓存部分。

blog.csdn.net/shu_lance/a…

【题目】Android 中是如何实现异步通信的?

blog.csdn.net/carson_ho/a…

【题目】你开发过程中使用到了哪些第三方库?了解过他们的源码吗?
【题目】你了解广播吗?它与 EventBus 有什么区别?能互相实现吗?

**标准广播:**完全异步执行的广播,当发出广播后,广播接收器几乎会在同一时刻接收到广播消息,所以没有先后顺序可言,效率比较高,无法被截断。

**有序广播:**同步执行的广播,广播发出后,会有一个广播接收器接收广播消息,当这个广播接收器中的逻辑执行完毕后广播才会继续传递。有先后顺序,优先级较高的接收器先收到广播消息并且可以截断正在传递的广播,使得后面的接收器无法收到广播消息。

**系统广播:**Android内置很多系统级别广播,如手机开机后发一条广播,电池电量发生变化发一条广播等等。

【题目】 什么是Hibernate框架?

Hibernate是一种ORM框架,全称为 Object_Relative DateBase-Mapping**,在Java对象与关系数据库之间**建立某种映射,以实现直接存取Java对象!

我们使用Hibernate框架就不用我们写很多繁琐的SQL语句,从而简化我们的开发!

【题目】你们网络请求是如何实现的?
【题目】知道 Volley 吗?内部实现流程是什么?

blog.csdn.net/droyon/arti…

【题目】Volley与 OKHttp 有什么区别?

www.voidcn.com/article/p-g…

【题目】你了解哪些第三方功能?知道推送吗?它的原理是什么?

blog.csdn.net/cyjbenyy/ar…

【题目】Activity启动模式以及各种启动模式下的startActivityForResult

startActivityForResult方法能够起效:standard和singleTop

startActivityForResult方法不能够起效:singleTask和singleInstance

【题目】Activity的四种启动模式详解

www.jianshu.com/p/7e70ee765… blog.csdn.net/zy_jibai/ar…

  • **标准模式(standard):**每次启动一个标准模式的Activity都会重新创建一个新的实例,不管这个Activity之前是否已经存在实例,一个任务栈中可以有多个实例,每个实例也可以属于不同的任务栈,谁启动了这个Activity,那么这个Activity实例就运行在启动它的那个Activity所在的栈中

  • **栈顶复用模式(singleTop):**在这种模式下,如果新启动的Activity已经位于任务战的栈顶,那么此Activity不会被重新创建,只会重新调用 onNewIntent 方法,这个Activity的onCreate、onStart都不会被系统调用。如果新Activity实例已经存在但不在栈顶,那么重新创建 Activity 并放入栈顶。

  • **栈内复用模式(singleTask):**这是一种单实例模式,一个栈中同一个Activity只存在唯一一个实例,无论是否在栈顶,只要存在实例,都不会重新创建,和 singleTop 一样会重新调用 onNewIntent 方法。

  • **单例模式(singleInstance):**这是一种加强的singleTask模式,它除了具有singleTask模式的所有特性外,还加强了一点,那就是此种模式的Activity只能单独地位于一个任务栈中,不同的应用去打开这个activity 共享公用的同一个activity。他会运行在自己单独,独立的任务栈里面,并且任务栈里面只有他一个实例存在。

【题目】context和applicationcontext的区别

首先Activity.this和getApplicationContext()返回的不是同一个对象,一个是当前Activity的实例,一个是项目的Application的实例,这两者的生命周期是不同的,它们各自的使用场景不同,this.getApplicationContext()取的是这个应用程序的Context,它的生命周期伴随应用程序的存在而存在;而Activity.this取的是当前Activity的Context,它的生命周期则只能存活于当前Activity,这两者的生命周期是不同的。getApplicationContext() 生命周期是整个应用,当应用程序摧毁的时候,它才会摧毁;Activity.this的context是属于当前Activity的,当前Activity摧毁的时候,它就摧毁。

【题目】onPause 和 onStop 有什么区别?
【题目】Android 五种布局的性能对比?
【题目】Android 四大组件是什么?分别说说对它们的理解?
【题目】Android之四大组件、六大布局、五大存储

blog.csdn.net/shenggaofei… blog.csdn.net/xiankog/art…

【题目】SharedPreferences数据存储的apply()和commit()区别

SharedPreference 相关修改使用 apply 方法进行提交会先写入内存,然后异步写入磁盘,

commit方法是直接写入磁盘。如果频繁操作的话 apply 的性能会优于 commit,apply会将最后修改内容写入磁盘。 但是如果希望立刻获取存储操作的结果,并据此做相应的其他操作,应当使用 commit。

【题目】Android 签名机制的原理?
【题目】反编译解压后的文件夹所包含的内容有哪些?
【题目】OkHttp详细解析

juejin.cn/post/684490… www.jianshu.com/p/eca3d9371…

【题目】关于 Service 的理解?它的启动方式有什么区别?

service是否在main thread中执行,service里面是否能执行耗时的操作? 默认情况,如果没有service所运行的进程,Service和Activity是运行在当前app所在进程中的main thread里面 service里面不能执行耗时的操作(网络请求,拷贝数据库,大文件) 特殊情况,可以在清单文件中配置service所在的进程,让service在另外的进程中执行。

Activity怎么和Service绑定,怎么在Activity中启动自己对应的Service? Activity通过bindService(Intent service,ServiceConnection conn,int flags)跟Service进行绑定,当绑定成 功的时候ServiceService会将代理对象通过会调的方式传给conn,这样我们就拿到了Service提供的服务代理对象。 在Activity中可以通过startService和bindService方法启动Service。一般情况下如果想获取Service的服务对象 那么肯定需要bindService()方法,比如音乐播放器,第三方支付等。如果仅仅只是为了开启一个后台任务那么可 以使用startService()方法。

【题目】 mvc mvp mvvm三种架构模式

mvc:业务逻辑、数据、界面分离的一种模式,简单的来说,就是通过controller来操作model层的数据,并且返回给view显示。

activity不是标准的controller,随着界面逻辑交互的复杂度提升,activity类的职责不断增加,变得臃肿。 view和model相互耦合,不利于开发。

mvp:主要是提出了presenter层,作为view和model之间沟通的桥梁。

程序逻辑放在presenter中处理,完全将view和model进行了分离,不允许他们之间沟通。

mvvm:主要是将presenter改为了viewmodel,和mvp类似,不同的是viewmodel跟view和model进行双向绑定。

使用了data binding

【题目】设计模式

www.runoob.com/design-patt…

【题目】观察者模式、EventBus、广播BroadcastReciver的区别

blog.csdn.net/qq_34895720…

定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。

【题目】Android EventBus 的使用

www.jianshu.com/p/e7d5c7bda…

【题目】Android APK打包流程

blog.csdn.net/wangzhongsh…

【题目】知道 Android 中的多渠道打包吗?
【题目】SparseArray介绍

blog.csdn.net/ma175629564…

【题目】Parcelable 和 Serializable的区别和使用

blog.csdn.net/hacker_craz…

【题目】Android系统显示原理简介

www.jianshu.com/p/a978a6250…

【题目】什么是 Spring Boot?

Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。

【题目】为什么要用 Spring Boot?

无代码生成和xml配置

【题目】Spring Boot 的核心配置文件有哪几个?它们的区别是什么?

Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。

application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。

bootstrap 配置文件有以下几个应用场景。

  • 使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
  • 一些固定的不能被覆盖的属性;
  • 一些加密/解密的场景;
【题目】Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:

@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。

@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。

@ComponentScan:Spring组件扫描。

【题目】你如何理解 Spring Boot 中的 Starters?

Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要到处找示例代码和依赖包。如你想使用 Spring JPA 访问数据库,只要加入 spring-boot-starter-data-jpa 启动器依赖就能使用了。

面试题总结网站: www.cnblogs.com/marsitman/p… www.jianshu.com/p/c93965357… blog.csdn.net/xiaohulunb?… how2j.cn/k/j2se-inte… www.jianshu.com/p/cfac5c131… www.jianshu.com/p/d256d8e3d… www.jianshu.com/p/5eb9ab39d…

刷题网站: 牛客网剑指offer,听网上说的刷了3遍,后来感觉时间耗的有点多,两遍就行加深记忆 www.nowcoder.com/ta/coding-i… leetcode热题HOT100: leetcode-cn.com/problemset/… 基础知识网站: java基础课程: www.feiyangedu.com/referer/ag2… Linux常用命令: www.cnblogs.com/yjd_hycf_sp…