Java知识总结,不止为了秋招(上)!!!




该知识分为两部分,(上)部分为Java技术体系,技术篇。(下)部分为Java基础知识,面试篇。

Java知识总结,不止为了秋招(下)!!!





写在前面:我想问大家一个问题,大家都说面试造火箭,工作拧螺丝。但是我真的在实习的时候发现,公司的项目比我想象的复杂多了。公司是一个金融公司,先不说代码上的各种配置,光是那些概念就给我弄的晕头转向的。那些培训机构都说自己的项目如何如何,但是我看了以后感觉也就那样呀,但是为什么我的工作项目差这么多?是公司项目的问题还是培训机构夸大了?


这是一篇总结已学Java体系的文章总结,此刻我还想为了秋招再挣扎一下,虽然知道结果应该也好不到哪里去,果然学习还是要看状态。


不过在整理的过程中,我慢慢发现,这些东西对于面试的帮助真心不大,但是我们又一定要会,不然过了面试以后的真实工作还得经历这个坎。后面我也会根据我简历上的技术栈再整理自己已经学过的那些在面试中能够回答出来的东西。


本文的内容比较精简(越往后越精简),只适合收藏起来整理思路,梳理知识点,不适合初学者,并且还有很多没有学。当然,如果你想学习具体的细节,在我的分栏专栏下的自学知识笔记中有详细的文档(跟着B站狂神说Java的教学视频自己一点一点敲的)

在这里插入图片描述




1、Java基础

基础语法直接带过


继承:

  1. 重写和重载的区别:重写一般为子承父业,子类继承父类,然后重写父类的方法,一般配上关键字@Override。重载为一个方法的多种实现,即相同的方法根据不同的参数个数返回不同的执行结果。
  2. 类加载的顺序:这里有实例化和初始化的概念。单就前期的Java基础来看的话,当我们调用子类的方法的时候,会先执行字类的构造方法(具体执行有参的还是无参的就根据指定的条件判断)在对应的构造方法执行中会马上执行父类的构造方法(也是根据我们指定的条件进行判断,默认就是父类的无参构造方法),然后执行后再依次返回
  3. super和this概念的区别:super为调用父类的方法,在对应的构造方法中默认存在,用于调用参数的时候,我们也就可以理解为父类的名字。this可以理解为当前的对象,如果我们外部的某个对象调用到了带有this的语句,那么我们就可以将this理解为那个对象,如果是在类的内部进行调用那么我们就可以吧this理解为这个类



封装:

  1. 成员变量和局部变量的区别:成员变量的作用范围为整个类,且和成员方法是属于同一个级别的。局部变量,顾名思义只是局部的,所以它的作用范围只能在类中的方法里面,即在等级上比成员变量低一个等级。
  2. 静态方法和实例化方法的区别:两个方法的加载顺序不一样。但就Java基础阶段的理解,则为静态方法必须被static关键字修饰,调用时直接使用类名就可以调用(虽然我们也可以像实例化方法的调用形式一样调用,但是没有必要,编译器也会进行相关的提示)。实例化方法,顾名思义实例化以后的方法,我们必须在对类进行new操作以后,才能够获取的方法,调用的方式为使用实例化对象.方法。
  3. 理解构造方法的作用:主要分为无参构造方法和有参构造方法两大类。由于在使用类之前的初始化,我们可以提前对数据进行判断以及逻辑处理
  4. 明白POJO的概念:对实体类进行对应的封装操作,带有getter/setter的方法的类,没有业务逻辑,可以带有简单的运算属性,但绝不能带有业务方法。



多态:

  1. 多态的前提:要有继承关系,有子父类方法的重写,要有父类对象的引用指向子类对象。
  2. 成员变量的方法特点:编译看左边,执行的结果也看左边
  3. 成员方法的访问特点:编译看左边,执行的结果看右边
  4. 自动转型的概念:以最顶级的类或者接口为0,最终到达的目的类为100,以我们当前的出发点为50。如果我们希望数字变小则自动转型,如果希望数字变大则需要强制转型(我们可以理解为0-50这条路我们是走过的,自己一个人能完成;但是50-100这段路没走过,需要有人帮助,即强制转)
  5. 抽象类:需要被abstract关键字修饰。不能被实例化。抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类。其子类要么也是抽象类,要么就必须实现其所有的方法。
  6. 接口的概念:一种公共的规范概念,实现这个接口就能获得某个功能
  7. 接口的成员特点:使用interface关键字修饰。成员变量只能是常量,且默认会被public static final修饰。成员方法只能是抽象方法,后面好像有变化




2、Java进阶

集合:

  1. ArrayList:底层由数组构成,每次的增删改查都可以理解为对数组的操作,我们且将其称为动态数组
  2. LinkList:底层是一个双向链表,每一个节点都有一个next和一个pre用于指向下一个节点和前一个结点的地址值。头部的pre和尾部的next均为null,链头用于存储数据个数、头部节点的地址、尾部节点的地址。
  3. Vector:可以简单的理解为加了syschronized的ArrayList
  4. HashMap:JDK1.7由数组+链表,JDK1.8及以后采用数组+链表+红黑树。存储的数据以key的hash值来寻找存储位置,存储的形式为key-value
  5. ConcurrentHashMap:HashMap的加强版,用于多线程中,且拥有良好的并发性。JDK1.7中采用分段锁的形式用于保证性能且兼顾并发,底层采用数组+链表,JDK1.8后采用CAS和synchronized锁,底层也变为了数组+链表+红黑树。
  6. HashTable:默认容量是11,默认加载因子是0.75。容量最小为1,可以是任意整数。线程安全,key与value都不能为null。简单理解为一个加锁的HashMap。其计算hash值的方法为直接使用hashCode方法,而HashMap为用计算方法重新计算hash值。遍历方法的底层有出入。(该集合对比HashMap学习)
  7. TreeMap:类比于红黑树来理解,即其为红黑树数据结构的实现
  8. LinkHashMap:LinkHashMap的数据是有序的,默认输出结果为插入的顺序,遍历顺序从Entry Header开始,根据其after值访问下一个数据,这个顺序的维护跟数据插入时的顺序相同,但是和数据存储时的顺序不同,存储时依然是按照HashMap的方式存储。扩容时LinkedHashMap是遍历的双向链表,取得每一个Entry,然后重新计算hash值,然后存放到新table的对应位置。(由于其是HashMap的子类,所有很多东西与HashMap相同)
  9. HashSet:它存储唯一元素并允许空值,它由HashMap支持,它不保持插入顺序,它不是线程安全的。(其底层就是一个HashMap,key为我们的值,value为一个叫present的Object对象)
  10. TreeSet:与HashSet对比,前者的实现是红黑树(带马甲的TreeMap),后者是哈希表;前者的数据是有序的,后者是无序的(其结构决定了是否有无顺序);前者的数据不允许出现null,后者存入数据可以为null。它可以支持两种排序自排序和定制排序。
  11. LinkHashSet:在HashSet的基础上,内部使用双向链表维护,输出顺序根据插入的顺序一致

补:

拉链法和线性探测法:

拉链法类似于HashMap中添加数据;线性探测法类似于ThrealLocalMap中添加数据



多线程:

  1. 线程的概念:线程的开启只能是底层的C++,Java本身是不能开启线程的。开启线程是使用.start方法而不是.run方法,后者只是调用方法。
  2. 线程实现的三种方式:
    1. 继承Thread类,其底层也是实现了Runnable接口
    2. 实现Runnable
    3. 实现Callable接口。使用Runnable的实现类FutureTask,该类能够接受Callable对象,继而达到实现多线程的结果。
  3. 线程的状态:进程本身的进程有创建、就绪、阻塞、执行和终止五种状态。但是Java的进程状态分为新建(new)、执行(runnable)、阻塞(blocked)、等待(wating)、超时等待(timed_wating)、终止(terminated)共6种,这里一定要区别操作系统中进程的5种状态
  4. Lambda表达式:用于匿名内部类的使用,为了简化代码而生。使我们的代码由原来的直接调用 --> 静态内部类 --> 局部内部类 --> 匿名内部类 --> lambda表达式。当我们的功类为根据指定输入得到确定输出时,就可以使用lambda表达式
  5. 线程的同步:使用sysnchronized关键字用于锁住对应的资源,或者使用lock锁以及其加强版ReentrantLock锁
  6. 线程间的通信:主要分为管程法和信号灯法。前者使用一个缓存空间,用于通知消费者生产者;后者使用一个标志位用于获取对应的进程状态
  7. 线程池:ExecutorService线程池接口,Executors线程池的工具类。利用线程池的工具类开启和关闭线程池,我们创建的线程只需要使用线程池接口的execute方法就可以将我们的线程放入其中。当然线程池的原理又是一个比较复杂的点,进阶阶段不做要求。



网络编程:

  1. OSI模型和TCP/IP参考模型:由上到下的层次分别为:七层为,应用层、表示层、会话层、传输层、网络层、数据链路层、物理层;四层为,应用层、传输层、网络层、链路层
  2. 网络的基本概念:C/S为客户端服务器,即我们的APP;B/S为浏览器服务器,即为我们的浏览器访问服务器资源。端口范围为0~65535,TCP和UDP都分别占65535个
  3. TCP与UDP的比较:UDP是用户数据报协议,在发送端,应用层将数据传递给传输层的 UDP 协议,UDP 只会给数据增加一个 UDP 头标识下是 UDP 协议,然后就传递给网络层;在接收端,网络层将数据传递给传输层,UDP 只去除 IP 报文头就传递给应用层,不会任何拼接操作。TCP是传输控制协议,由于是可靠连接,就会出现三次握手、四次挥手的经典案例。
  4. 三次握手、四次挥手理解:见链接

img

补充:这篇博客写的很详细

一文搞懂TCP与UDP的区别



注解和反射:

  1. 注解的概念:不属于程序本身,更多的起到的是一个标识的作用
  2. Java的内置注解:@Override(重写方法)、@Deprecated(过时或不建议使用)、@SuppressWarnings(镇压警告)
  3. 自定义注解(元注解):@Target(描述注解使用范围),@Retention(用于描述注解的生命周期),@Documented(标记后表示将被保存在javadoc中),@Inherited(子类可以继承父类中的该注解)
  4. 反射机制理解:反射是Java被视为动态语言的关键,反射机制允许程序在执行期借助对应的反射API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法
  5. ClassLoader的理解:类的加载分为类的加载、类的链接、类的初始化三个步骤,我们所有的类都是由一个Class模板创建的,所以哪怕是不同的对象,但是他们都是来自同一个模板。
  6. 利用反射获取内部结构:代码练习



文件/IO:




3、数据库

MySQL:

  1. 数据库分类:关系型数据库和非关系型数据库,前者更稳定,后者更灵活。
  2. 基本的CRUD语句:多敲代码
  3. 分页查询:在SQL语句的最后使用LIMIT 1,2,前者表示起始位置,后者表示页面大小
  4. 事务:ACID原则
  5. 连接:join(等同于full join)、left join(以前面对的表为基表)、right join(以后面的表为基表)、inner join(只筛选出两个表中公共的部分)、full join(将所有的数据能连接的连接上,不能连接上的就直接顺序输出)
  6. 常用的函数:向下取整、向上取整、转大写、转小写、切割字符串、反转、绝对值、获取当前日期、获取当前时间、获取当前系统用户、获取当前版本…
  7. 索引:主键索引、唯一索引、常规索引、全文索引(内容很多,考点也多)
  8. 三大范式:**保证每一列的表信息都不可以再分;在满足第一范式的前提下,每张表只描述一件事情;在满足第二范式的前提下,确保每张数据表中的每一列数据都是和主键直接相关,不能间接相关。**不过我们现实却很难做到这样,毕竟规范和性能很难两全
  9. JDBC:java-database-connection。创建步骤:1、利用反射加载对应的驱动。2、获取用户的相关信息,包括账户密码以及数据库位置。3、获取我们连接后的数据库对象。4、利用数据库对象创建一个SQL对象。5、利用SQL对象执行SQL语句。6、获取我们的返回结果。7、遍历输出我们的返回结果。8、释放连接

Oracle:

  1. 视图:封装的编译好的SQL语句,视图更加灵活,不占用空间
  2. 索引:(内容很多,考点也多)
  3. 存储过程:即使用SQL语句编写逻辑代码,用于输出指定的结果
  4. 表空间:Oracle的表空间的概念为将很多表放在一个表空间里面,用于隔离部分表之间的关系




4、前端

HTML:

  1. 前端概念的入门:我们的页面都是由一个一个的HTML标签组成,
  2. 基本标签的使用:b、br、a、text、span、div、checkbox、button、ul(无序)、ol(有序)…

CSS:

  1. 基本概念的理解:层叠样式表,用于在HTML标签的基础上,增加对应的样式效果
  2. 选择器:1、基本选择器:标签选择器(直接作用标签),类选择器(.类名的形式),id选择器(#id名的形式)。2、层次选择器:后代选择器(标签1 标签2{}),子选择器(标签1 > 标签2{}),相邻兄弟选择器(标签1 + 标签2{}),通用选择器(标签1 ~ 标签2)。3、伪类选择器(有点特指的含义):4、属性选择器(a[标签 = " "]{},内部可以是正则表达式与属性选择器的结合体)
  3. 盒子模型的理解:margin:外边距。border:边框。padding:内边距。
  4. 区分块级标签和行内标签:

JS:

  1. 概念的理解:一种前端的脚本语言,目前最新为ES6
  2. 基础语法:var num = 3
  3. 数据类型(简略):变量、number(JS不区分小数和整数)、字符串、布尔值、逻辑运算、比较运算符(绝对相等使用===)、null和undefined、数组、对象。
  4. 数据类型(详细):字符串(获取字符串长度,大小写转换,字符串的截取)、数组(字符串的长度,通过索引获取数据,截取数组,push和pop弹出头部为尾部,unshift和shift压入头部和尾部,sort排序,concat连接)、对象(var 对象名 = {x : x1, y : y2},不存在对象属性时提示未定义)、流程语句(foreach循环,for…in循环)、Map和Set(var map = new Map([[key1, value1], [key2, value2], [key3, value3]]),var set = new Set([value1, value2, value3]))、iterator(迭代器,内置于数组、map和set中,我们遍历时直接使用for (let num of map) 即可输出)
  5. 函数:格式为var test= function (x) {},调用方式为test(x)
  6. 内置的对象:typeof (用于获取对应数据的数据类型)、Date(用于获取和时间有关的信息)、JSON(使用方法用于和JS对象之间的相互转化,这一个点十分重要。JSON和JS对象的区别为,JSON最外层带有双引号,且对象名也带有双引号)
  7. 操作BOM:浏览器对象,直接作用与浏览器的。window(获取浏览器窗口信息)、Navigator(获取浏览器本身的信息)、screen(获取我们当前电脑的尺寸)、location(获取我们本地的信息)、document(获取当前页面的信息,即把当前页面假想为一棵文档树,我们可以获取树上面的信息。也可以用来获取cookie)、history(操作浏览器的历史记录)
  8. 操作DOM:即上面提到的文档树,把页面想象成一颗带有各种信息标签的文档树,我们可以动态的获取到对应树上面的结构信息,继而达到我们动态修改网页的效果。
  9. jQuery:jQuery库,里面存在大量的JavaScript函数,好比Java里面一个比较优秀的API。可以使用它来更加方便快捷的操作前端界面




5、Java Web

1、Java Web概念:可以提供给浏览器访问的程序。又分为静态网页和动态网页,

2、Tomcat访问原理:当我们输入一个指定的访问域名,系统会先去我们本机的host文件下寻找对应的地址,如果没有就去DNS服务器上寻找,如果还是找不到那就返回找不到资源的提示

3、Maven配置:1、下载Maven。2、配置环境变量。3、修改maven的配置文件,配置阿里云镜像。4、在本地新建一个maven仓库,用于存放依赖资源,并且同时在maven的配置文件中进行仓库位置的配置(公司有对应的maven资源就配置公司的仓库)。

4、Servlet原理及调用:Servlet是sun公司用于开发动态web的一门技术,把实现了Servlet接口的java程序叫做Servlet。创建Servlet步骤:1、创建一个普通的Java类。2、继承HttpServlet类。3、重写类中的doGet和doPost方法,并利用(HttpServletRequest req, HttpServletResponse resp)这两个参数完成我们想要的执行逻辑。4、在web.xml文件中,添加对应的映射信息。

5、ServletContext:类似于每个单独Servlet的共享空间,能同时访问多个Servlet的资源

5、请求转发和重定向:请求转发,无法获取到某个资源,就寻找一个中间人帮忙,在中间人的帮助下获取到对应的资源。重定向,获取某个资源时,未获取到于是再次想其他方法获取

5、Cookie、Session概念:Cookie是客户端技术(响应,请求)。Session是服务器技术,可以保存用户的会话信息,我们可以把信息或者数据放在session中。区别:1、Cookie是把用户的数据写给用户浏览器,浏览器保存(可以保存多个)。2、Session把用户的数据写到用户独占Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)。3、Session对象由服务器创建

6、MVC三层架构:Model、View、Controller

7、监听器、过滤器、文件下载:代码练习




6、SSM框架

Spring:

  1. 核心模块:Spring AOP、Spring ORM、Spring DAO、Spring Web、Spring Context、Spring Web MVC、Spring Core
  2. IOC、DI、AOP概念:控制反转:使用接口的方式,将原本注入的类变成接口,当我们想要获取对应的类时,由原来new的方式,变成我们直接去Spring容器中拿。依赖注入:注入属性的方式,由于不在new对象,所以传递参数的形式也就有所变化。面向切面编程:将我们想要实现的功能,通过动态代理的方式加入到其中,其好处是不改变原来代码的结构,就能完成新功能的添加
  3. 框架配置方式:1、导入需要的依赖。2、创建pojo类。3、在application.xml文件中配置bean。4、编写service层(接口及具体实现类)。5、编写测试类,打印测试结果
  4. DI的各种方式:构造器注入、set注入、cp命名空间注入、自动注入。
  5. 自动装配的使用:使用byName或者byType来完成属性的注入。
  6. xml与注解:我们通常更建议xml文件用来管理bean,注解只是负责完成属性的注入。
  7. 使用注解开发:@Autowired和@Qualifier(value = “XXX”)为一套配合使用的注解。可以用于指定唯一的bean对象。在使用之前需要导入aop的jar包
  8. 动态代理:基于接口的:JDK动态代理,基于类:cglib。动态代理分五个部分:抽象的功能,拥有功能的本体,可以添加功能的代理角色,需要添加的功能,面向的客户



MyBatis:

  1. 概念入门:MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
  2. 简单的测试程序:1、创建对应的数据库信息。2、导入需要的依赖。3、在mybatis-config.xml中配置数据库的相关信息。3、创建对应的pojo类。4、编写dao层接口,以及dao层对应的mapper实现类。5、编写service层(接口及具体实现类)。6、编写对应的测试类,测试结果。
  3. 配置文件(mybatis-config.xml)的讲解:1、environment:transactionManager(可以配置事务管理器)、dataSource(数据源,不同的数据源对于数据的处理效果不同)、properties(我们的数据库参数信息)。2、typeAliases(由于具体的pojo类太过于累赘,一般取别名简化使用)。3、settings:设置的内容包括cacheEnabled(缓存的开启)、lazyLoadingEnabled(懒加载)、mapUnderscoreToCamelCase(数据库和pojo字段的格式切换)、localCacheScope(缓存形式)、logImpl(日志打印方式)
  4. MapperRegistry:绑定我们的mapper文件。四种方式:使用相对于类路径的资源进行引用、使用完全限定的资源定位进行引入、使用映射器接口的完全限定类名(mapper文件需要和接口名字必须相同并且位置也要在同一个包下)、直接使用package扫描一个包下面的资源(mapper文件需要和接口名字必须相同并且位置也要在同一个包下)
  5. 日志的使用:LOG4J(一个开源的日志项目。1、导入依赖。2、添加对应的配置信息。3、在日志配置中选择LOG4J。)、STDOUT_LOGGING(直接在日志开启的选项上进行选择即可)
  6. 分页的使用:主要就是在使用的时候多带上几个参数,用于确定分页的相关细节信息,具体的实现得到代码中查看
  7. 使用注解开发:在对应的dao层接口上,直接使用注解的形式,将SQL代码写到括号后面,对于简单的SQL能够极大的简化开发,但是对于复杂的SQL语句,就比较难处理。
  8. 多对一、一对多的查询:主要明白表与表,字段与表之间的关系映射。在配合适当的关键字即可
  9. 动态SQL:用于实现更加复杂的SQL语法,在SQL中添加对应的逻辑判断,让代码扩展性更好。
  10. 一级缓存和二级缓存的理解:一级缓存是SqlSession级别的缓存,默认会开启。二级缓存是全局缓存,基于namesapce,需要手动开启。当用户进行数据访问时,先在二级缓存中进行查找,再往一级缓存查找,最后再向数据库中进行查找。使用增删改以后,对应缓存级别下的缓存会失效



SpringMVC:

  1. 执行流程:
    1. 用户发送请求至前端控制器DispatcherServlet。
    2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
    3. 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
    4. DispatcherServlet调用HandlerAdapter处理器适配器。
    5. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
    6. Controller执行完成返回ModelAndView。
    7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
    8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
    9. ViewReslover解析后返回具体View。
    10. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
    11. DispatcherServlet响应用户
  2. 注解:@Controller( 用于表示为控制层 )、@RequestMapping(用于获取传入参数的值)、@ResponseBody(作用于方法上,可以将整个返回结果以某种格式返回,例如JSON或XML)
  3. JSON和AJAX:JSON是一种格式,和对象放在一起理解,区别于对象,JSON的外层和成员变量都会被" "包裹。AJAX是一种异步的通信方式,将就的是异步的交互(随着你的动态输入,对应的提示也会有变化),使得我们的用户的体验更好。
  4. 拦截器
  5. 文件的上传和下载
  6. 整合SSM




7、JVM

1、JMM分布情况:分为线程私有和线程共享还有直接内存三部分。线程私有主要由程序计数器、虚拟机栈、本地方法栈三部分组成。线程共享主要由方法区还有Java堆组成。

2、重要区域的要点理解:双亲委派机制,当类加载器加载一个类时,他会将这个请求向上委托给符类加载器去完成,一直委托到根加载器。启动加载器检查是否能够加载当前这个类,能加载就结束,使用当前加载器。否则就向上查找,如果都不能加载那就会报错

3、栈:栈里面存放的是一个一个的栈帧,每一个栈帧由局部变量表、操作数栈、动态链接、返回地址

4、堆:常见的类的空间划分为,伊甸园区、幸存者0区、幸存者1区、养老区、永久代存储区(jdk8以后改名为元空间,且元空间是逻辑上存在,物理上不存在)。

5、垃圾回收算法的入门理解:阶段一,引用计数法和GC Root。阶段二,标记清除算法、标记整理算法、复制算法。




8、Spring Boot框架

1、装配机制:在@SpringBootApplication注解是有三个主要的核心注解组成。@SpringBootConfiguration(里面的注解是@Configuration–>@Component,表明该类是一个Spring的配置类,相当于一个beans.xml文件)、@EnableAutoConfiguration(重点)、@ComponentScan(自动扫描并加载符合条件的组件或bean定义,最终将这些bean定义加载到容器中)。@EnableAutoConfiguration下面有@AutoConfigurationPackage(其注解下有AutoConfigurationPackages.Registrar.java,功能是将前面@ComponentScan扫描到了的包,将他们注册进容器)和AutoConfigurationImportSelector.java(自动导入包的核心)。AutoConfigurationImportSelector,该类中会通过getCandidateConfigurations方法去获取对应的配置configurations,该方法中又通过SpringFactoriesLoader.loadFactoryNames方法去获取对应路径下(META-INF/spring.factories)的配置文件。总结一句话就是:@EnableAutoConfiguration作用就是从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器

2、SpringApplication.run分析:核心的四个步骤

  1. 推断应用的类型是普通项目还是Web项目
  2. 查找并加载所有可用初始化器,设置到initializers属性中
  3. 找出所有的应用程序监听器,设置到listensers属性中
  4. 推断并设置main方法的定义类,找到运行的主类

3、yaml语法

server:
  port: 8081 --对应的属性冒号后面需要使用空格

4、核心配置文件和配置类文件的关系:一旦配置类生效,这个配置类就会给容器中添加各种组件,这些组件的属性是从对应的配置类中获取的,配置类中每一个属性又是和配置文件一一对应。多有在核心配置文件中能够配置的属性都是在配置类中封装着,核心配置文件能配置什么是参考其对应的属性配置类。总结一句话就是:yaml的核心配置文件中能够配置的属性,是来自配置类(被@Configuration标记)中的属性值

5、Thymeleaf模板引擎:

--语法格式
<div th:text="${msg}"></div>

6、整合Druid数据源:导入对应的maven依赖;创建一个配置类,用于返回我们的DruidDataSource;在核心配置文件中,配置我们对应的属性;测试代码即可

7、整合安全框架Spring Security、Shiro:认证(确认你的身份是不是满足)和授权(确认你是否拥有对应的权限)两个概念。1.整合方式都是添加maven依赖;2.创建一个AuthorizingRealm 类的子类用于添加对应的逻辑代码;3.创建一个配置类,用于配置对应的信息(需要引入前面的AuthorizingRealm 的子类);4.编写对应的测试代码及其他配置

8、整合Swagger:一个用于前后端协同开发的平台,支持RESTful风格。使用方式为:1.导入对应的maven依赖。2.编写对应的配置类,添加对应的注解。3.编写对应的测试代码

9、分布式Dubbo+ZooKeeper+SpringBoot:zookeeper重点在一个注册中心,用于注册。Dubbo用于提供生产者和消费者,以及对应的Dubbo admin用于监控中心




9、Spring Cloud

1、概念的理解:Spring Cloud并非侧重技术,强调的是一个生态,强调的是一种全新的解决办法,大家各司其职把整个项目做大做强。

2、微服务的问题:客户端该如何去访问(Zuul)服务之间如何进行通信(Feign或Ribbon);如何管理这么多服务(Eureka);服务出了故障怎么处理(Hystrix)。当然我的技术都是针对SpringCloud Netflix的技术。

3、Eureka:对标ZooKeeper,用于注册发现。前者强调AP,后者强调CP。ZooKeeper的特点是当其中的服务挂掉以后,他依然能够返回对应的数据,只是数据是之前的注册信息,使其拥有高一致性(当其中master节点与其他节点失去联系以后,会重新推选master节点,会有很长的时间导致服务瘫痪)。而Eureka则是调整到其他能够访问的数据,使其拥有高可用性。

  • Eureka Server:提供服务注册与发现
  • Server Provider:将自身服务注册到Eureka中,从而使得消费方能够找到
  • Server Consumer:服务消费方从Eureka中获取注册服务列表,从而找到消费服务

4、Ribbon:负载均衡,类比于nginx。继承AbstractLoadBalancerRule 类就可以完成我们自定义负载均衡算法,其自带的算法有简单轮询、随机连接

5、Feign:区别于Ribbon,同样是实现了负载均衡,两种实现的方式略有区别。以编写Mybatis时为例,Feign更像是一个使用注解的方式实现,前者想使用mapper的形势

6、Hystrix:一个用于处理系统出错的组件。这里需要区分服务熔断(类比于股市的熔断,用于处理服务出现问题的一种处理异常的机制)和服务降级(为了给流量大的服务提供更多的资源,所以会减少其他服务的开销,使用缺省值或其他方式,使我们的整个服务能更好的执行)的概念

7、Zuul:等同于Spring Gateway,用于配置外界访问时的路径




10、Redis、Vue、Elasticsearch

Redis:

  1. 概念介绍:是用 C 语言开发的一个开源的高性能键值对数据库,端口号为6379。

  2. 数据类型:Redis种的常用的数据类型可以分成五类,string(String)、hash(HashMap)、list(LinkedList)、set(HashSet)、sorted_set(TreeSet)。使用incr关键字来设置主键。其中hash和set是无序的,list和sorted_set是有序的

  3. 未完全



Vue:

  1. 前端知识体系的理解:结构层+表现层+行为层。Angular(模块化)+ React(虚拟DOM) = Vue(特点结合)
  2. Vue的架构:MVVM结构。 其中ViewModel 所封装出来的数据模型包括视图的状态和行为两部分,这样就能够解耦View层和Model层,View展示的不再是Model中的数据,而是VM中的带有状态和行为的数据,更新了数据视图就会自动更新,达到事件驱动编程的效果。
  3. Vue的基本概念:Vue就是ViewModel 层的实现者,实现DOM监听与数据绑定。在 MVVM 架构中,是不允许数据和视图直接通信的,只能通过ViewModel来通信,而 ViewModel就是定义了一个Observer观察者。ViewModel 能够观察到数据的变化,并对视图对应的内容进行更新,并且ViewModel 能够监听到视图的变化,并能够通知数据发生改变
  4. 代码:自己多练习
  5. Vue的通信问题:Axios 是一个开源的可以用在浏览器端和NodeJS的异步通信框架。
  6. Webpack的理解:需要NodeJS环境。可以简单理解为对我们编写的前端代码添加一定的标识,始得我们前端项目在运行的时候能够被浏览器更加友好的支持
  7. Vue-Router的理解:当我们需要添加新的功能时,只需要添加一个新的组件,然后配置对应的路由,再在主界面中进行对应的引用即可。



Elasticsearch:

  1. 概念的介绍:是一个基于Lucene的搜索服务器,且支持纠错和高亮,默认端口9200(Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架)。其对应的可视化界面的端口为9100
  2. Lucene:Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库,是一个全文检索引擎的架构
  3. 与Solr的对比:
    1. 当单纯的对已有数据进行搜索的时候,Solr更快
    2. 当实时建立索引时,Solr会产生IO阻塞,查询性能较低。Elasticsearch具有明显的优势
    3. 随着数量的增加,Solr的搜索效率会变得更低,而Elasticsearch却没有明显的变化
  4. ELK:
    1. 其中Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框 架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用Elasticsearch作为底层支持框架,可见Elasticsearch提供的搜索能力确实强大,市面上很多时候我们简称Elasticsearch为es。
    2. Logstash是ELK 的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出 到不同目的地(文件/MQ/redis/elasticsearch/kafka等)。
    3. Kibana可以将elasticsearch的数据通过友好 的页面展示出来,提供实时分析的功能。
  5. 与Kibana的整合:默认端口5601
  6. IK分词器的概念:用来对我们的词进行分割操作。结合Kibana对于数据的操作,使得我们能够更好的对获取到的数据进行处理
  7. 未完全
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默辨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值