- java面向对象编程
面向对象(概念):
- 三大特性:
- 封装:
- 封装,就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。一个类就是一个封装类了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
- 继承:
- 继承,指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”,“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”和“组合”来实现。继承概念的实现方式有两类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称,但是子类必须提供实现的能力。
- 多态:
- 多态,是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同结构内部的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
五大原则
- 单一职责原则(SRP)
- 是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。
- 开放封闭原则(OCP)
- 一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。
- 里氏替换原则(LSP)
- 子类应当可以替换父类并出现在父类能够出现的任何地方。
- 依赖倒置原则(DIP)
- 高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。
- 依赖倒置的核心思想是面向接口编程。 依赖倒置的一个核心原则就是降低耦合性
- 接口分离原则(ISP)
- 模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来。
- 高内聚,低耦合
- 高内聚
- 高内聚是针对类内部的方法而言,把程序的功能尽量分散,别在一个类里只写一个方法,这样会给调试等带来很多麻烦。
- 所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一原则。
- 低耦合
- 低耦合是针对类与类之间的关系而定,意思是类之间的关系要简单,不要有很强的依赖关系,不然,运行起来就会出问题,使一个类的运行影响到其他的类。
- 常用的设计模式
- 单例模式
- 一个类在java虚拟机中只有一个对象,并提供一个全局访问点
- 解决问题:对象的唯一性,性能浪费太多。
- 应用场景:数据库连接对象,属性配置文件的读取对象。
- 模式结构:饿汉式和懒汉式(如果考虑性能的话,就用懒汉式,因为懒汉式是在方法里面进行初始化的),构造器私有化,对外提供方法加同步关键字。
- 简单工厂
- 用一个方法来代替new关键字
- Spring的核心就是工厂模式。
- 解决问题:对象产生过多,或者经常有子类替换生成。
- 应用场景:对于经常生成的对象,或者父子类替换生成。
- 模式结构:写一个对外声明的方法,方法里面使用new关键字代替。
- 代理模式(Proxy)
- 为其他对象提供一个代理,以控制对当前对象的访问
- Spring里面的AOP实现。
- 解决问题:不能直接访问该对象,或者太大的资源耗费多。
- 应用场景:权限,或者大对象的访问权限。
- 模式结构:代理类和被代理类实现同一个接口,用户访问的时候先访问代理对象,然后让代理对象去访问被代理对象。
- 适配器模式
- 将两个原来不兼容的类兼容起来一起工作
- 类适配器和对象适配器的区别:类适配器通过继承来完成适配,对象适配器则是通过关联(组合)来完成。
- 解决问题:以及存在的相同功能的代码,但是接口不兼容,不能直接调用。
- 应用场景:在使用旧的API的时候,没有源码,和新的不能兼容。
- 模式结构:分为类适配器和对象适配,一般常用的就是对象适配器,因为组合优于继承。
- 类适配器:
在目标接口中的 request() 调用 Adaptee 的 adapteeRequest() 方法呢?
对象适配器:
策略模式
- 定义一系列算法并可以互相替换
- 解决问题:做一件事情有很多种方法。
- 应用场景:购物车里面的付款方式。
- 模式结构:声明一个顶级接口,定义一个策略方法,具体的实例都要实现这个接口。
模版模式
- 父类定义流程,子类实现流程
- 解决问题:业务有多种,但都有规定的流程。
- 应用场景:一般基类的实现都是模版模式,BaseDAO,bBaseService
- 模式结构:定义一个抽象父类定义流程,或者常用方法和常量,子类继承父类,实现具体的细节方法。
项目管理工具
- Maven
- 优点:
- Maven是一个项目管理和综合工具。Maven提供了开发人员构建一个完整的生命周期框架。
- 在多个开发团队环境时,Maven可以设置按标准在非常短的时间里完成配置工作,使开发人员的工作更加轻松。
- Maven增加可重用性并负责建立相关的任务。
- 缺点:
- maven是一个庞大的构建系统,学习难度大
- maven采用约定优于配置的策略(convention overconfiguration),虽然上手容易,但是一旦出了问题,难于调试。
- 当依赖很多时,m2eclipse 老是搞得Eclipse很卡。
- 中国的网络环境差,很多repository无法访问,比如google code, jboss 仓库无法访问等。
- SVN
- 优点:
- 管理方便,逻辑明确,符合一般人思维习惯。
- 易于管理,集中式服务器更能保证安全性。
- 代码一致性非常高。
- 适合开发人数不多的项目开发。
- 缺点:
- 服务器压力太大,数据库容量暴增。
- 如果不能连接到服务器上,基本上不可以工作,看上面第二步,如果服务器不能连接上,就不能提交,还原,对比等等。
- 不适合开源开发(开发人数非常非常多,但是Google app engine就是用svn的)。但是一般集中式管理的有非常明确的权限管理机制(例如分支访问限制),可以实现分层管理,从而很好的解决开发人数众多的问题。
- Git
- 优点:
- 适合分布式开发,强调个体。
- 公共服务器压力和数据量都不会太大。
- 速度快、灵活。
- 任意两个开发者之间可以很容易的解决冲突。
- 离线工作。
- 缺点:
- 学习周期相对而言比较长。
- 不符合常规思维。
- 代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
- 常用的一些开源框架
- SpringBoot
- 什么是springboot?
- 用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(propertites或yml文件)
- 创建独立的spring引用程序main方法运行
- 嵌入的tomcat无需部署war文件
- 简化maven配置
- 自动配置spring 添加对应功能starter自动化配置
- springboot常用的starter有哪些?
- spring-boot-starter-web嵌入tomcat和webkaifa需要servlet与jsp支持
- spring-boot-starter-data-jpa数据库支持
- spring-boot-starter-data-redis数据库支持
- spring-boot-starter-data-solr solr支持
- mybatis-spring-boot-starter第三方的mybatis集成starter
- springboot自动配置的原理
- 在spring程序main方法中添加@SpringBootApplication或者@EnableAutoConfiguration会自动去mavenzhong读取每个starter中的spring.factories文件,该文件配置了所有需要被创建spring容器中的bean
- springboot读取配置文件的方式
- springboot默认读取配置文件为application.properties或者application.yml
- SpringCloud
- 什么是微服务?
- 以前的模式是所有的代码在同一个工程中 部署在同一个服务器中 同一个项目的不同模块不同功能互相抢占资源
- 微服务 将工程根据不同的业务规则拆分成微服务 微服务部署在不同的机器上 服务之间进行相互调用
- java微服务的框架有dubbo(只能用来做微服务),springCloud(提供了服务的发现,断路器等)
- 什么是spring cloud?
- SpringCloud为开发人员提供了快速构建分布式系统的一些通用模式(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,群集状态)。分布式系统的协调导致了锅炉板模式,并且使用Spring Cloud开发人员可以快速地站起来来实现这些模式的服务和应用程序。它们可以在任何分布式环境中正常工作,包括开发人员自己的笔记本电脑,裸机数据中心和受管平台,Cloud Foundry。
- springcloud如何实现服务的注册和发现
- 服务在发布时 指定对应的服务名(服务名包括了IP地址和端口) 将服务注册到注册中心(eureka或者zookeeper)
- 这一过程时springcloud自动实现,只需要在main方法添加@EnableDisscoveryClient 同一个服务修改端口就可以启动多个实例
- 调用方法:传递服务名称通过注册中心获取所有的可用实例,通过负载均衡策略调用(ribbon和feign)对应的服务
- SpringCloud断路器的作用
- 当一个服务调用另一个服务由于网络原因或者自身原因出现问题时 ,调用者就会等待被调者的响应,
- 当更多的服务请求到这些资源时,导致更多的请求等待,这样就会发生连锁效应,断路器就是解决这一问题的。
- SpringMVC
- 对SpringMVC框架的理解:
- mvc指的是Model(业务模型),View(视图),Controller(控制器)
- SpringMVC就是Spring框架的一个模块,所以它可以和spring框架进行无缝结合,它是一个基于mvc设计思想的前端web层框架,主要作用就是对前端请求进行处理。它的前端控制器是一个servlet,它的请求拦截是基于方法级别的。
- 执行流程:
- SpringMVC框架主要由DispatcherServlet,处理器映射,处理器(控制器),视图解析器,视图组成。
Spring
- Spring一般是作为容器管理其他框架
- AOP:面向切面编程
- AOP:面向切面编程,将跟业务逻辑没有关系的代码提取出来,在调用目标方法之前或者之后执行。 常用的场景,事务,日志,权限控制,异常处理等方面。
- IOC:控制反转
- IOC:创建对象的权利,交给spring容器创建。
- DI:依赖注入
- DI:如果一个对象A需要使用另一个对象B才能实现某个功能,这时就可以说A对象依赖于B对象, 而spring容器在创建A对象时,会自动将A对象需要的B注入到A对象中,此过程就是依赖注入。
- 核心容器
- 核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory, 它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置 和依赖性规范与实际的应用程序代码分开。
- Spring上下文
- Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务, 例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
- Spring AOP:
- 通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以, 可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中 的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到 应用程序中。
- Spring DAO:
- JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的 错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和 关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
- Spring ORM:
- Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、 Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
- Spring Web 模块
- Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以, Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及 将请求参数绑定到域对象的工作。
- MyBatis
- 对Mybatis的理解
- Mybatis是一个优秀的ORM框架,应用在持久层,它对jdbc的操作数据库过程进行封装,使开发者只关注SQL本身,而不需要花费精力去处理例如注册驱动,创建connection,等jdbc繁杂的过程代码,一般用mapper代理的方式开发,直接在xml里面写sql。
- Mybatis的工作流程
Hibernate
- 对hibernate的理解
- Hibernate是轻量级的持久层解决方案,是一个关系数据库ORM框架, 对JDBC访问数据库的代码做了封装.我们可以很容易的对数据库进行增删改查操作.
- hibernate的查询方式
- (1)导航对象图检索方式。根据已经加载的对象,导航到其他对象。
- (2)OID检索方式。使用get或者load加载对应的对象
- (3)HQL检索方式。
- (4)QBC检索方式。
- (5)SQL检索方式。
- sql与hsql的区别
- (1)sql是直接操作数据库的
- (2)hql是通过操作对象操作数据库,对大小写敏感。
- 一级缓存和二级缓存的区别
- 一级缓存是session级别的缓存,二级缓存是sessionFactory级别的缓存。
- hibernate中get和load的区别?
- get和load都是根据id获取数据。
- (1)get先查询session中对应id是否有数据,如果有则直接返回,有查询数据库,如数据库中没有则返回为null;
- (2)load方式查询session中对应id是否有数据,如果没有生成代理对象,查询数据库。如没有对应的id则抛出异常
- hibernate和mybatis对比?
- 在移植性方面hibernate配置一下方言即可.而一般情况下mybatis则需要修改sql语句
- hibernate是一个完全的ORM框架.完全的面向对象.更符合我们开发者的思维模式.mybatis需要我们手动写sql语句
- hibernate的优化成本比较高.因为hibernate的sql语句是自动生成的,所以在优化方面一般的新手无从下手.而mybatis只要修改sql就可以了.更加容易上手
- Spring Data JPA
- JPA意即Java持久化API,是在JDK5.0后提出的持久化规划,JPA的出现主要是为了简化持久层开发以及整合ORM技术。
- ORM映射元数据:支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系。
- API:操作实体对象来执行CRUD操作
- 查询语言:通过面向对象而非面向数据库的查询语言(JPQL)查询数据,避免程序的SQL语句紧密耦合。
使用SpringData创建查询
Spring Data Mongodb
- hibernate是传统数据库的ORM框架(Object Relational Mapping对象关系映射,简称,ORM)
- mongoDB是nosql的非关系型数据库
- mongoDB的ORM框架,有mongoDB官方提供Morphia框架或者spring-data-mongoDB框架
Shiro
- Shiro的优点
- Shiro架构的核心组件
- Shiro认证过程
- 创建SecurityManager -> 主体提交认证 -> SecurityManager认证 -> Authenticator认证 -> Realm验证
- Shiro授权过程
- 创建SecurityManager ->主体授权 -> securityManager授权 -> Authorizer授权 ->Realm获取权限数据
常用的数据库
- mysql
- mongodb
- oracle
- redis
- memcached缓存框架
- Memcached是一款开源的、高性能的纯内存缓存服务软件。Mem是内存的意思,cache是缓存的意思,d是daemon的意思。 memcache 是项目名称,也是一款软件,其架构是C/S架构。
- 缓存: 将数据存储到内存中,只有当磁盘胜任不了的时候,才会启用缓存
- 缺点:断电数据丢失(双电),用缓存存储数据的目的只是为了应付大并发的业务。
- 数据库: mysql(关系型数据库,能够保证数据一致性,保证数据不丢失,当因为功能太多,导致性能不高) ===数据参考
- 缓存数据库: memcache redis(非关系型数据库,性能极高,但不保证数据完整性) === 业务的数据提供者
- memcachedb 会将内存的数据写入到磁盘中
- redis 主要工作场所是内存中,但是定期备份内存数据到硬盘
- memcache优点:
Activiti工作流
- 什么是工作流,工作流的核心对象是什么,activiti共操作数据库多少张表
- 工作流就是多个参与者,按照某种预定义的规则,传递业务信息,进行审核的功能一个框架(Activiti)
- processEngine,调用Service,从而操作数据库的表
- 23表
- 工作流中的接口
- RepositoryService:流程定义和部署对象
- RuntimeService:执行管理,包括流程实例和执行对象(正在执行)
- TaskService:执行任务相关的(正在执行)
- HistoryService:历史管理
- IdentityService:Activiti表的用户角色组
消息中间件
- ActiveMQ
- ActiveMQ/ApolloMQ
- 优点:老牌的消息队列,使用Java语言编写。对JMS支持最好,采用多线程并发,资源消耗比较大。如果你的主语言是Java,可以重点考虑。
- 缺点:由于历史悠久,历史包袱较多,版本更新很缓慢。集群模式需要依赖Zookeeper实现。最新架构的产品被命名为Apollo,号称下一代ActiveMQ,目前案例较少。
- RabbitMQ
- 优点:生态丰富,使用者众,有很多人在前面踩坑。AMQP协议的领导实现,支持多种场景。淘宝的MySQL集群内部有使用它进行通讯,OpenStack开源云平台的通信组件,最先在金融行业得到运用。
- 缺点:Erlang代码你Hold得住不? 虽然Erlang是天然集群化的,但RabbitMQ在高可用方面做起来还不是特别得心应手,别相信广告。
- 使用Dubbo分布式服务治理框架及Zookeeper分布式服务协调框架的运行原理及开发
- Dubbo
- 什么是分布式?什么是集群?主要区别
- 分布式是将一个服务分个部分,然后通过远程调用方式进行。远程调用框架RPC框架,spring cloud,dubbo。集群是将同一个服务的多个副本部署在不同的集群上,通过负载均衡的方式提供复试。场景:厨师。
- 服务治理包括哪些内容?
- 服务治理需要服务治理框架,dubbo。即对服务进行管理,例如服务的接口名称,权重等信息。
- 注册中心的作用?你怎么理解注册中心的?
- 如果没有注册中心,需要在本地维护一个provider的地址列表。注册中心角色,它是集中式数据管理,消费者通过注册中心来访问数据。通过注册中心,使得provider和consumer之间是透明。
- 什么是RPC?
- 远程调用框架。
- dubbo中负载均衡的策略有哪些?
- Provider: 集群,集群只需要重启几个实例即可。
- Zookeeper:集群
- Consumer:集群
- 负载:Loadbalence轮询,随机
- Zookeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
来源:掘金 链接:https://juejin.im/post/5db59f08e51d4529fe07a3bd
关注我,私信回复“资料”获取面试宝典《Java核心知识点整理.pdf》“,覆盖了JVM、锁、高并发、反射、Spring原理