
一. JAVA基础题1. JDK和JRE区别JRE是java运行环境有JRE只能运行java程序JDK是java开发工具包括java开发环境和java运行环境有jdk可以运行java程序同时也能开发java程序注释方法三种 // /* /**多行注释与文档注释区别 多行注释的内容不能用于生成一个开发者文档而文档注释的内容可以生产一个开发者文档。Java提供了哪几种循环结构它们各自的特点是什么while 当条件成立时循环do...while 先运行,然后结尾判断是否可以继续循环 (循环体至少被循环1次)for 不知道循环次数时三种循环可以相互替换。2. Java支持哪些数据类型什么是 封箱和拆箱Java支持基本数据类型和引用数据类型基本数据类型byteshortintlongfloatdoublebooleanchar引用类型String 类、接口、数组装箱 自动将基本数据类型转换为包装器类型拆箱 自动将包装器类型转换为基本数据类型。3. 说明private、protected、public和default的区别类内部 本包 子类 外部包public 1 1 1 1protected 1 1 1 0default 1 1 0 0private 1 0 0 04. static关键字能否被重写(1) static 关键字表示静态的意思用于修饰成员变量和成员函数(2) static一般是用来静态代码块来优化程序性能(3) static块可以放在类的任意地方类可以有多个static块(4) 在类初次加载时按照static块的顺序执行每个static块并且只会执行一次非静态方法属于类的实例是可以被子类重写从而达到多态的效果static修饰的是静态方法属于类不能被重写故而也不能实现多态。5. 与equal()区别(1) 基本数据类型只能用不能用equal比较值(3) 引用类型包装类型比较的是地址值equal比较的是值(4) 对象和equal比较的都是地址值如果equal重写则比较值不重写比较地址值6. char和vachar区别(1) char长度不可变不够用空格填充到指定长度vachar长度可变(2) char存取速度比vacar快但是占空间(3) char英文占1个字节中文占2个字节.vachar英文和汉字都占2个字节7. String,StringBuffer和StringBuilder(1) 当对字符串进行修改的时候需要使用StringBuffer和StringBuilder(2) String为字符串常量创建后不可更改StringBuffer和StringBuilder类的对象能够被多次修改并且不产生新的未使用对象(3) StringBuilder运行速度快StringBuffer线程安全8. Array和ArrayList区别(1)Array长度固定 包含基本类型和对象类型 只能存同种类型元素(2)ArrayList长度可变 只能包含对象类型 ArrayList存储不同类型的数据 但效率低(3)Array不能够随意添加和删除其中的项而ArrayList可以在任意位置插入和删除项8.1 ArrayList和LinkedList(1)ArrayList的实现基于数组LinkedList的实现基于双层链表(2)对于get set方法ArrayList速度要优于LinkedListArrayList通过数组下标查找元素LinkerList要移动指针遍历每个元素直到找到为止(3)对于插入和删除操作LinkedList速度要优于ArrayListArrayList在新增删除时可能会删除或复制数组,LinkedList只需修改指针即可(4) LinkerList不支持 高效的随机访问(5)LinkedList比ArrayList更占内存9说出你知道的设计模式答Factory工厂模式 Builder建造模式 Factory Method工厂方法模式Prototype原始模型模式 Singleton单例模式 Facade门面模式Adapter适配器模式 Bridge桥梁模式 Composite合成模式Decorator装饰模式 Flyweight享元模式 Proxy代理模式Command命令模式 Interpreter解释器模式 Visitor访问者模式Iterator迭代子模式 Mediator调停者模式 Memento备忘录模式Observer观察者模式 State状态模式 Strategy策略模式Template Method模板方法模式 Chain Of Responsibleity责任链模式10. this和super区别this代表本类对象的一个引用,可以调用一个类的资源super代表的是父类的对象的一个引用,在子类中可以调用父类的资源如果在构造方法里,this和super都必须是第一条(1)This代表本类对象的引用class Cat{ this.XXX } 可以理解成: Cat this new Cat();(2)super代表父类对象的引用class Father{ }class Son extends Father{ super.XXX }可以理解成: Father super new Father();(3)this可以在两个变量名相同时,用于区分成员变量和局部变量(4)this 可以在本类的构造方法之间调用,位置必须是第一条语句,注意,不能相互调用,会死循环super是发生了继承关系以后,子类如果想用父类的功能,可以通过super调用(5)如果发生了重写,还想用父类的功能,需要使用super来调用(6)Super在调用父类构造方法时,必须出现在子类构造方法的第一条语句,而且如果父类中没有提供无参构造,子类可以通过super来调用父类其他的含参构造11. overload和override区别(1)重载Overload 与重写Override的区别(2)重载: 是指在一个类中的现象,是指一个类中有很多同名的方法,但是方法的参数列表不同(3)重写: 是指发生了继承关系以后(两个类),子类去修改父类原有的功能语法规则:子类的方法签名(返回值类型 方法名(参数列表) )与父类一致(4)重写方法的修饰符: 子类权限 父类的权限(5)重载的意义: 是为了方便外界对方法进行调用,什么样的参数程序都可以找到对应的方法来执行,体现的是程序的灵活性(6)重写的意义:是在不修改源码的前提下,进行功能的修改和拓展(OCP原则:面向修改关闭,面向拓展开放)12. 抽象类Abstarct与接口Interface的区别实现方式抽象类可以同时包含抽象方法和具体方法。接口在Java 8之前所有方法都是抽象方法在Java 8及以后可以有默认方法和静态方法。类的继承一个类只能继承一个抽象类不能多继承抽象类。一个类可以实现多个接口。状态的持有抽象类可以有成员变量维护一定的状态。接口在Java 8之前不能有成员变量Java 8以后可以有静态变量但通常不用于维护状态。设计目的抽象类主要用于代码的重用提供一个共同的基类让子类在此基础上扩展或实现特定的方法。接口主要用于定义一个公共的协议或契约所有实现该接口的类必须遵守这个协议接口常用于声明方法的集合而不关心具体的实现。应用场景对比抽象类需要一个共同的基类部分方法需要在子类中实现部分方法已经有具体实现。需要包含成员变量和构造方法维护一定的状态。需要提供部分方法的默认实现而子类可以选择是否覆盖这些方法。接口需要定义一个公共的协议或契约方法的具体实现由不同的类负责。需要实现多多继承即一个类需要继承多个不同的方法集合。需要在Java8及以后版本接口中增加默认方法和静态方法以扩展功能。13. 静态static(1) 可以修饰成员变量与成员方法(2) 随着类的加载而加载优先于对象加载(3) 只加载一次就会一直存在不再开辟新空间, 直到类消失才一起消失(4) 静态资源也叫做类资源,全局唯一,被全局所有对象共享(5) 可以直接被类名调用(6) 静态只能调用静态非静态可以随意调用(7) static不能和this或者super共用因为有static时可能还没有对象14. Java集合类框架的基本接口有哪些Collection和Map 一个元素集合一个是键值对集合(1)其中List和Set接口继承了Collection接口一个是有序元素集合一个是无序元素集合而ArrayList和LinkedList 实现了List接口HashSet实现了Set接口。(2)HashMap 和HashTable实现了Map接口并且HashTable是线程安全的但是HashMap性能更好14.1 HashMap简介(1) HashMap底层存储结构数组链表红黑树(JDK1.8后加入红黑树)(2) HashMap是用于存储Key-Value键值对的集合(3) HashMap中键key为null的记录最多只允许一条Value为null的记录可以有多条(4) HashMap非线程安全 即同一时刻允许多个线程同时写HashMap,可能导致数据的不一致14.2 HashMap和HashTable(1) HashMap继承AbstrectMap类,HashTable继承Dictionary类(已废弃)(2) HashMap线程不安全HashTable线程安全,但HashMap效率高(3) HashMap没有contains方法有containsValue和containsKey方法HashTable都有(4) HashMap允许key和value为null值HasnTable不能为空否则空指针异常HashMap的key类型可以是string也可以是Integer15. Java集合类里最基本的接口有Collection单列集合的根接口List元素有序 可重复ArrayList类似一个长度可变的数组 。适合查询不适合增删LinkedList底层是双向循环链表。适合增删不适合查询。Set元素无序不可重复HashSet根据对象的哈希值确定元素在集合中的位置TreeSet: 以二叉树的方式存储元素实现了对集合中的元素排序Map双列集合的根接口用于存储具有键key、值value映射关系的元素。HashMap用于存储键值映射关系不能出现重复的键keyTreeMap用来存储键值映射关系不能出现重复的键key所有的键按照二叉树的方式排列二. Activity相关1. 四大组件Activity界面Service后台服务启动方式startService() bindService().contentProvider数据存储或共享URI为唯一标识broadcastRecevier广播静态注册或动态注册如接受开机广播或其他APP发送的广播2. 常用的五大UI布局LinearLayout线性布局子元素水平(horizontal)或垂直(vertical)排列RelativeLayout相对布局通过相对位置如layout_below、layout_alignParentTop定位控件。ConstraintLayout约束布局支持复杂相对定位、链式布局、权重分配推荐用于减少嵌套。FrameLayout帧布局子控件层叠显示后添加的在上层TableLayout表格布局按行列组织控件列宽由最宽单元格决定。GridLayout网格布局跟TableLayout差不多3. 五大存储方式SharePreferences键值对方式存储以xml方式自动保存文件存储FileopenFileInput 和 openFileOuput 方法读取设备上的文件SQLite数据库contentProviderURI网络存储调用WebService返回的数据或是解析HTTP协议实现网络数据交互3. Activity生命周期onCreatonStartonResumeonPauseonStoponDestory。Activity到后台一般都是onResume状态再次启动调用onResume。可见生命周期: 从onStart()开始到onStop()结束。在这个阶段.Activity 对用户是可见的但不一定能与用户交互。前台生命周期: 从onResume()开始到onPause()结束。在这个阶段Activity处于前台能与用户交互。竖屏切换横屏时生命周期的转变1、默认情况下系统会销毁并重新创建当前的ActivityonPause()—onStop()—onDestory()—onCreate()—Start()—onResume()2、设置Activity的android:configChangesorientation或android:configChangesorientation|keyboardHidden时切屏还是会重新调用各个生命周期切横、竖屏时只会执行一次也会执行onConfigurationChanged方法3、设置Activity的android:configChangesorientation|keyboardHidden|screenSize时切屏不会重新调用各个生命周期只会执行onConfigurationChanged方法。切屏切记要加上screenSize,否则4.0版本以上生命周期不生效4. Activity启动模式Standard: 默认模式每次启动Activity都会创建一个新的Activity实例并加入任务栈不会考虑这个实例是否已存在singleTop: 如果调用得Activity位于栈顶不会重新创建新的。如果不位于栈顶则会创建新的实例。singleTask调用得Activity位于栈顶不会创建新的。如果不位于栈顶则把该Activity置于栈顶并销毁其上方的所有Acitivity。一般用于主界面或频繁使用的界面singleInstance : 整个Activity在系统内存中只有一个实例独享一个栈。5. 事件分发机制Activity -- ViewGroup -- View用户触摸传递给 Activity 的 dispatchTouchEvent().Activity 将事件交给 window 调用 superDispatchTouchEvent()window 将事件传递给跟布局 DecorView 开始View层级传递事件依次经过各级 ViewGroup 的 dispatchTouchEvent() 和 onInterceptTouchEvent()若未被拦截事件到达最底层的 View触发 onTouchEvent()若所有 View未消费事件事件将回溯至 Activity 的 onTouchEvent()6. Hanlder机制用于在不同线程之间进行通信和消息处理。以下是对 Handler的详细讲解Message表示一个消息对象可以携带数据和消息标识。通过Message.obtain()方法来获取 Message实例然后设置其 what 属性来标识消息的类型arg1、arg2等属性来携带简单数据也可以通过obj属性携带复杂对象。MessageQueue:消息队列用于存储Handler发送的消息。每个线程都有一个与之关联阿松的MessageQueue主线程的MessageQueue会自动创建子线程如果需要使用Handler,通常也需要手动创建MessageQueue。enqueueMessage有锁所以线程安全。Looper:Looper负责从MessageQueue中不断取出消息并将其分发给对应的Handler进行处理。在使用Handler的线程中必须先准备好Looper可以通过Looper.prepare()方法来准备然后通过Looper.loop0方法来启动循环。让Looper开始从消息队列中取消息并分发。对于主线程Android系统已经自动为其创建了Looper。工作原理首先在主线程或其他需要处理消息的线程中创建一个Handler实例。这个Handler会与当前线程的Looper 关联进而与该线程的MessageQueue关联。当在其他线程如子线程)中需要发送消息时。创建一个Message对象并通过 Handler的sendMessage()或相关方法将消息发送到MessageQueue中。Looper 不断循环检查MessageQueue中是否有消息。当有消息时 Looper取出消息并将其传递给Handler的handleMessage()方法进行处理。在handleMessage()方法中可以根据消息的what属性来判断消息的类型并进行相应的处理如更新U等。6.1 looper.loop()为什么不会阻塞主线程looper.loop()是一个可唤醒的阻塞式等待。当消息队列为空时线程进入休眠状态不消耗 CPU直到有消息到达时才会唤醒。7. 多线程与线程池1. 多线程继承Thread类实现run方法实现Runnable方法Handler一般用于更新UI。sendMessage() , post()。(可能会造成内存泄漏解决方法使用静态类或弱引用或Activity生命周期结束时清空handler消息队列调用方法removeCallbacksAndMessages())2. 线程池ThreadPoolExecutor基本线程池FixedThreadPool固定容量线程池可重用固定线程数。特点参数为核心线程数只有核心线程无非核心线程并且阻塞队列无界。创建一个定长线程池可控制线程最大并发数超出的线程会在队列中等待。CachedThreadPool缓存线程池特点没有核心线程只有非核心线程并且每个非核心线程空闲等待的时间为60s采用SynchronousQueue队列。创建一个可缓存线程池如果线程池长度超过处理需要可灵活回收空闲线程若无可回收则新建线程。ScheduledThreadPool定时线程特点创建一个定长线程池支持定时及周期性任务执行。SingleThreadExecutor单线程特点创建一个单线程化的线程池它只会用唯一的工作线程来执行任务保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。SingleThreadScheduledExecutor3. sleep与wait区别wait() 方法属于 Object 类需要在 Sync 块或方法中调用sleep() 属于 Thread 类可以在任何地方调用sleep() 和 wait() 都会让线程暂停执行但是 wait() 会释放锁sleep() 不会释放锁会一直占用资源wait() 需要被 notify() 或 notifyAll() 唤醒sleep() 会自动苏醒wait() 一半用于线程间通信与协作。 sleep() 一般用于让线程暂停一段时间wait() 和 sleep() 都需要抛异常InterruptedException。8. 异步与同步1. 异步AsyncTaskhandlerActivity的runOnUIthreadview.post()2. 同步锁synchronized修饰方法vloatile修饰变量9. 强引用与弱引用强引用正常的new一个对象就是强引用。JVM无法回收弱引用weakReference修饰只要出发GC垃圾回收就会被回收10. GC垃圾回收机制Java的GC功能可以自动回收内存。触发条件调用System.gc触发系统自身决定触发时机。Java堆分新生代老年代永久代。新生代所有新new的对象。老年代存储存活时间比较长的对象。永久代JVM运行程序时需要这些产生的。当新生代部分内存满了之后触发一次垃圾回收小收集。新生代大部分对象都是需要回收的无法回收的移动到老年代。老年代也被填满后触发垃圾回收大收集涉及到所有存活对象所有比较慢。如果永久代里某些类不在被使用同时其他类需要更多空间这些类就会被垃圾回收11. 自定义viewonMeasure方法作用此方法的主要任务是测量View的大小。onLayout方法作用onLayout 方法用于确定 View 在父容器中的位置。onDraw方法•作用onDraw方法用于绘制View的内容。在这个方法中可以使用Canvas和 Paint 对象来绘制各种图形、文本、图像等。通过 Canvas 提供的绘制方法如drawLine、drawCircle、drawText等结合Paint 设置的样式如颜色、线条粗细、字体等)可以实现丰富多样的界面效果。上述顺序即执行顺序onTouchEvent: onTouchEvent方法的调用时机取决于用户的触摸操作。当用户触摸屏幕时系统会将触摸事件传递给相应的View从而触发 onTouchEvent 方法。12. RecycleView12.1 缓存机制四级缓存AttachScrap屏幕内缓存CacheView屏幕外缓存默认个数2ViewCacheExtension自定义缓存抽象类可继承重写它的方法RecyclePool缓存池保存缓存先从 AttachScrap 或 ChangeScrap 中匹配 ViewHolder 如果没有再去 CacheView里边找如果没有看是否有 ViewCacheExtension 自定义缓存有的话区自定义缓存里找还没有再去 RecyclePool 缓存池里找如果都没有调用 onCreatViewHolder 和 onBindViewHolder 绑定数据。12.2 使用步骤1. xml 里边添加 RecycleView 控件 添加一个item.xml 布局文件2. Main里边绑定 RecycleView通过 setLayoutManager() 设置布局继承RecycleView.Adapter(逻辑实现)RecycleView.Holder(View视图)12.3 刷新方法notifyDataSetChanged() —— 全量刷新notifyItemChanged(int) —— 刷新单个ItemnotifyItemChanged(int, Object) —— 局部刷新刷新 Item 内部的某个控件notifyItemInsert(int) —— 插入单个 ItemnotifyItemRemoved(int) —— 删除单个 ItemnotifyItemMove(int, int) —— 移动 ItemnotifyItemRangeChaged(int, int) —— 批量更新 ItemnotifyItemRangeInsert(int, int) —— 批量插入 ItemnotifyItemRangeRemoved(int, int) —— 批量删除 Item12.4 与ListView区别1.布局管理ListView只有垂直列表布局RecycleView 使用 LayoutManager 管理布局支持线性布局网格布局瀑布流布局。2.视图复用RecycleView 使用 ViewHolder 模式实现视图复用减少 findViewById 的调用提高性能。ListView也支持视图复用但不强制使用ViewHolder。3. 动画RecycleView内置 ItemAnimator 动画支持添加、删除、移动项的动画效果。ListView没有内置动画支持需要手动实现。4. 装饰器模式RecycleView支持 ItemDecoration可以轻松添加分割线、间隔等装饰。ListView需要自定义。5. 性能优化RecyclerView 通过视图复用、预加载、批量处理等机制优化滑动性能配合 DiffUtil 实现精准的增量更新减少不必要的重绘。ListView 滑动性能较差处理大量数据时可能会卡顿且缺少内置的增量更新机制。13. 动画分三类帧动画补间动画属性动画过渡动画13.1 帧动画由一组图片集合而成是一种具有动画效果的图片资源对应的 xml 标签是animation-list。使用 xml 布局加载13.2 补间动画类型AlphaAniomation透明度RotateAniomation旋转ScaleAniomation缩放TranslateAniomation平移主要是向view对象设置动画效果但View实际位置未改变13.3 属性动画可以队任何对象做动画不仅仅是view通过 ValuAnimator 或 ObjectAnimator、AnimatorSet来实现。animator.start()开始。通过 InterPolator插值器控制动画速度。多个动画组合播放animatorSet.play(1).after(2)动画2在动画1执行完后执行13.4 ObjectAnimator 与 ValueAnimaror 区别1. ValueAnimator 是 ObjectAnimator 的父类2. ObjectAnimator 是对 对象进行操作ValueAnimator 是对 值 进行操作手动赋值实现动画效果需要设置监听器进行操作// 透明度动画ObjectAnimator.ofFloat(mAlphaImage, alpha, 1, 0, 1).setDuration(4000) // 执行时间.start();// 缩放final AnimatorSet animatorSet new AnimatorSet(); mScaleImage.setPivotX(mScaleImage.getWidth()250); mScaleImage.setPivotY(mScaleImage.getHeight()250);animatorSet.playTogether(ObjectAnimator.ofFloat(mScaleImage, scaleX, 1, 0).setDuration(2000),ObjectAnimator.ofFloat(mScaleImage, scaleY, 1, 0).setDuration(2000) ); animatorSet.start();15. AMS PMS Binder UI绘制流程 HashMap集合与扩容机制 ArrayList 排序算法16. MVP, MVVM架构 databinding用法和原理17. 如何优化包体积启动时间 bundle三. 数据库1. 事务的四大特征(1) 原子性一个事务中的所有操作要么全部成功要么失败回滚如果操作成功必须完全应用到数据库中如果失败则对数据库无影响。(2) 一致性在事务开始前和结束后数据库的完整性不会被破坏。如A向B转账不会出现A扣了钱B没收到的情况(3) 隔离性当多个用户同时访问数据库时数据库为每一个用户开启的事务不会被其他事务的操作干扰同一时间只允许一个事务请求同一数据不同的事务不会被干扰A在银行取钱在A取钱完成前B无法向这张卡转账(4) 持久性事务处理结束后对数据的修改就是永久性的即使系统故障也不会丢失。2. 事务隔离级别四个隔离级别读未提交读已提交可重复读序列化(1) 脏读一个事务访问到了另一个事务未提交的数据(2) 不可重复读一个事务范围内多次访问返回了不同的数据(3) 幻读事务B前后两次读取同一范围的数据在两次读取过程中事务A新增了一条数据导致事务B第二次读取到了第一次查询到的行不可重复读侧重修改幻读侧重新增或删除3. 数据库悲观锁和乐观锁悲观锁先获取锁在进行业务操作一般用select ... for update这样的语句对数据枷锁避免其他事务意外修改数据乐观锁先进行业务操作只在最后更新数据时进行检查数据是否被更新过4. 数据库分库分表分库与分表的目的在于减小数据库的单库单表负担提高查询性能缩短查询时间5. 说一说drop、delete与truncate的区别drop从数据库中删除表所有的数据行权限索引也会被删除不能回滚truncate删除表中的所有数据不能回滚delete删除表中的全部数据或一部分数据执行后需要提交或回滚来执行删除或撤销删除操作可以回滚6. 数据库里面的索引和约束是什么(1) 索引是为了提高数据的检索速度(2) 索引是建立在数据表上根据一个或多个字段建立的约束是为了保持数据的完整性(3) 约束有主键约束外键约束唯一约束非空约束默认约束检查约束。索引主键索引唯一索引普通索引全文索引组合索引主键索引与唯一索引区别(1) 一个表只能有一个主键约束但可以有多个唯一索引(2) 唯一索引可以为null主键索引不能7. JDBC连接数据库步骤(1) 加载数据库驱动 Class.forName(com.mysql.jdbc.Driver);(2) 创建并获取数据库链接 DriverManager.getConnection(3) 创建JDBC statement对象(4) 设置sql语句(5) 通过statement执行sql并获取结果(6) 对sql执行结果进行解析处理(7) 释放资源8. sql连接(1) 内连接两边都对应有记录的才展示(2) 左(外)连接左表的记录将会全部表示出来而右表只会显示符合搜索条件的记录不符合的null填充。(3) 右(外)连接左表只会显示符合搜索条件的记录而右表的记录将会全部表示出来不符合的null填充。9. 缓存击穿与缓存崩溃缓存击穿数据会存到本地缓存如果频繁得访问本地缓存内没有的数据时就会直接访问数据库即缓存击穿缓存崩溃大量得key失效10. union与union allunion对两个结果集进行并集操作不包括重复行并进行默认排序union all对两个结果集进行并集操作包括重复行不排序11. 多表联查Studen学生表 (SID --学号,SNAME --学生姓名,SDEPT --所属单位,SAGE --学生年龄)Course课程表 (CID --课程编号,CNAME --课程名称,)Stugrade成绩表(SID --学号,CID --课程编号,GRADE --成绩)(1) 使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名?答案select SID ,SNAME from student where SID in(select SID from course,stugrade where course.CIDstugrade.CID and course.CNAME’税收基础’)(2) 使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位?答select SNAME,SDEPT from student s,stugrade sc where s.SIDsc.SID and sc.CID’c2’(3) 使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位?答select SNAME,SDEPT from student where SID not in(select SID from stugrade where CID’c5’)(4) 查询选修了课程的学员人数答select count(distinct SID) from sc(5) 查询选修课程超过5门的学员学号和所属单位?答select SNAME,SDEPT from student where SID in(select SID from stugrade group by SID having count(distinct CID)5)四. spring框架1. spring是什么(1) Spring是一个轻量级开源框架,面向bean的编程;(2) 最重要的是有一个创建bean对象的工厂-----bean工厂 , 实现低耦合高内聚;(3) 最主要的功能是IOC,AOP,Web MVC;(4) 可用于构筑应用程序;(5) Spring是一个集成了许多第三方框架的大杂烩其核心时IOC(控制反转也叫依赖注入)和AOP(面向切面编程)(6) Spring是一个AOP框架也是一IOC容器。Spring 最好的地方是它有助于您替换对象。有了Spring只要用JavaBean 属性和配置文件加入依赖性协作对象。然后可以很容易地在需要时替换具有类似接口的协作对象。(7) Spring七个模块Spring context,AOP,DAO,ORM,Web,MVC,Core好处(1) 降低模块的耦合度(2) 使系统容易扩展(3) 设计决定的迟绑定使用AOP,设计师可以推迟为将来的需求作决定因为它可以把这种需求作为独立的方面很容易的实现。(4) 更好的代码复用性2. SpringMVCSpringMVC是一个基于java实现MVC设计模式的请求驱动类型的轻量级Web框架属于spring的一个模块通过把Moudle(模型)-View(视图)-Controller(控制器分离)将web层进行值则解耦实现前后端分离将复杂的web应用分成逻辑清晰的及部分简化开发方便组内开发人员之间的配合。SpringMVC核心组件(1) 前端控制器DispatherServlet(2) 处理器映射器HandlerMapping(3) 处理器适配器HandlerAdapter(4) 处理器Handler(5) 视图解析器ViewResolver(6) 视图ViewSpring MVC工作流程1用户发送请求至前端控制DispatcherSerlet2DispatcherServlet收到请求后调用HandlerMapping处理器映射器请求获取Handle3处理器映射器根据请求url找到具体处理器生成处理器对象及处理器拦截器一并返回给DispatcherServlet4DispatcherServlet调用HandAdapter处理器适配器5HandlerAdapter经过适配调用 具体处理器(Handler,也叫后端控制器)6Handler执行完称返回ModelAndView7HandlerAdapter将Handler执行结果ModelAndView返回给DispathcherServlet8DispatcherServlet将ModelAndView传给ViewReslover试图解析器进行解析9ViewReslve解析后返回具体View10DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)11DispathcerServlet响应用户3.SpringCloudSpringCloud是基于SpringBoot的Spring集成应用程序是一系列框架的有序集合他利用SpringBoot开发便利性巧妙地简化了分布式系统的开发做到一键启动和部署SpringCloud五大组件Eureka注册中心Ribbon负载均衡Zuul网关Feign动态代理Hystrix熔断器4. IOC实现原理(1) 它是通过反射机制工厂模式实现的在实例化一个类时(2) 它通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中。(3) 控制反转就是获得依赖对象的方式反转了。5. AOP的实现一是采用动态代理技术利用截取消息的方式对该消息进行装饰以取代原有对象行为的执行二是采用静态织入的方式引入特定的语法创建“方面”从而使得编译器可以在编译期间织入有关“方面”的代码6. 什么是RestFul post增/delete删/put改/get查(1) RestFul可以简化get请求的类型将参数使用/的方式进行分隔减少了url参数传递的字节信息(2) RestFul规定可以通过一个url地址通过不同的请求类型控制业务逻辑请求路径中不能出现动词7. nginx负载均衡正向代理客户访问服务器需要经过代理服务器转接反向代理8. nginx负载均衡 五种算法(1) 轮询: 每个请求按照时间顺序逐一分配到不同的后端服务如果后端某台服务器司机自动剔除故障系统使用户访问不受影响(2) 加权轮询weight值越大分配到的访问概率越高主要用域后端每台服务器性能不均衡的情况或仅仅在主从情况下设置不同的权值达到合理有效的利用主机资源(3) IP哈希每个请求按访问的IP的哈希结果分配使来自同一个IP的方可笃定访问呢一台后端服务器(4) fair也就是根据后端服务器的响应时间来分配请求响应时间短的优先分配。需安装upstream_fair模块(5) url_hash: 按访问的URL的哈希结果来分配请求,使每个URL定向到一台钩端服务器可以进一步提高后端缓存服务器的效率10. redis支持的数据类型string字符串hash哈希list列表set集合及zset (sorted set有序集合)11. 启动项用到的注解(1) SpringBootApplication: SpringBoot核心注解开启自动配置(2) ComponentScan: 自动扫描并加载符合条件的组件或bean定义最终将这些bean定义加载到IOC容器中告诉Spring哪个packages的注解标识的类会被spring自动扫描并且装入bean容器(3) MapperSccan: mapper扫描否则无法使用mapper层(4) EnableAutoConfiguration借助import的支持收集和注册特定场景相关的bean定义,开启自动配置功能(5) SpringBootConfiguration继承configuration标注当前类是配置类(6) Target用于定义在注解的上边表明该注解可以使用的范围。12.SpringMVC常用注解1RequestMapping用于请求url映射可用于类或方法上用于类上标识所用响应请求的方法都是以该地址作为父路径2RequestBody注解实现接收http请求的json数据将json转化为java对象3ResponseBody注解实现将controller方法返回对象转化为json格式串相应给客户13. spring cloud和Dubbo区别1Dubbo关注的领域是SprignCloud的一个子集。Dubbo专注于服务治理其在服务智力、灰度发布、流量发布方面比SpringCloud更全面SpringCloud覆盖整个微服务架构领域2Dubbo使用RPC调用的效率高一些SpringCloud是通的HTTP调用效率低使用更简单14.HTTP状态码2**请求成功 4**客户端错误 5**服务器错误1200请求成功2204请求成功未返回内容3301url资源已更新并返回更新后的url4400客户端请求语法错误服务器无法理解5401该请求需要进行认证6403服务器收到请求但拒绝访问7404未找到资源请求资源不存在8500服务器在执行请求过程中发生错误9503服务器正忙15.get与post区别1get请求参数附在URL传递分割URL跟数据连接数据长度会受到限制post参数放在Request Body中post更安全2get请求只支持url编码post请求支持多种编码方式3get请求回退是无害的post会再次提交请求4get请求参数会被完整的保存在浏览器历史记录里post参数不会保留5请求过程不同get请求浏览器会将http header和data一起发送过去服务器响应返回数据post请求浏览器先发送header服务器响应100浏览器在发送data服务器响应返回数据但他们本质都是TCP连接由于HTTP的规定以及操作系统或浏览器限制使用时会有所不同