2019 java中高级 面试题汇总

答题的要点  1. 概念  2. 原理  3. 优点 

Spring

一、说说你对spring的理解

首先spring是一个开源框架,为了解决企业应用程序开发复杂性而创建的,它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率。

其次spring架构是一个分层架构,由7大模块组成

1.spring IOC

2.spring AOP

3.spring 上下文

4.springDao

5.springMVC

6.springWeb

7.springORM

然后spring自己也有几大框架

spring MVC、spring Boot丶spring cloud丶spring data丶spring security

二丶说一下springIOC

IOC控制反转也叫依赖注入,我理解的是它就是一个生产和管理bean的一个容器,你自己不需要通过new去生成对象而是通过spring bean的工厂来生成所需要的对象。

原理

将对象交给容器管理,你只需要在spring配置文件中配置对应的bean以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在A里面new这些bean了。

三丶说一下springIOC的几种注入方式

1.通过注解注入

2.调用set方法注入

3.通过构造方法注入

四丶说一下springAOP

简单来说,就是将那些与业务无关,却为业务模块共同调用的逻辑封装起来,减少重复代码降低了代码的耦合度。并有利于未来对代码的可操作性和可维护性。

原理

实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码

五丶说一下springMVC

M-Model 模型(完成业务逻辑:有javaBean构成,service+dao+entity)

V-View 视图(做界面的展示  jsp,html……)

C-Controller 控制器(接收请求—>调用模型—>根据结果派发页面)

 

六丶spring常用接口

1.ApplicationListener:当需要监听自定义事件时,可以新建一个实现ApplicationListener接口的类,并将该类配置到Spring容器中。

2.FactoryBean:用于创建特定的对象,对象的类型由getObject方法的返回值决定。

3.ApplicationContextAware:当一个类需要获取ApplicationContext实例时,可以让该类实现ApplicationContextAware接口。

4.ApplicationEvent:当需要创建自定义事件时,可以新建一个继承自ApplicationEvent抽象类的类。

 

七丶spring cloud有哪些组件

https://blog.csdn.net/yejingtao703/article/details/78331442/

spring cloud常见面试题

https://blog.csdn.net/moakun/article/details/82817757

 

JVM

 

 

集合

一丶HashMap底层原理

 https://www.cnblogs.com/java-jun-world2099/p/9258605.html

二丶List面试题

https://www.cnblogs.com/chanshuyi/p/4998776.html

MQ

一丶为什么使用MQ

面试官问这个问题的期望之一的回答是,你们公司有什么业务场景,这个业务场景有什么技术挑战,如果不用MQ可能会很麻烦,但是再用了之后带来了很多好处。

消息队列的常见使用场景有很多但是核心的有三个:解耦、异步、削峰

二丶消息队列的优点和缺点?

优点:特殊场景下解耦、异步、削峰。

缺点:

系统可用性降低:系统引入的外部依赖越多,越容易挂掉,本来你就是A系统调用BCD三个系统的接口就好了,人ABCD四个系统好好的没什么问题,你偏加个MQ进来,万一MQ挂了怎么办,整套系统崩溃了,就完蛋了

系统复杂性提高:硬生生加个MQ进来,你怎么保证消息没有重复消费?怎么处理消息丢失的情况?怎么保证消息传递的顺序性?

一致性问题:系统A处理完了直接返回成功了,人家都认为你这个请求成功了;但问题是,要是BCD三个系统哪里BD系统成功了,结果C系统写库失败了,咋整?数据就不一致了。

三丶如何保证消息不被重复消费(如何保证消息消费时的幂等性)?

在消息生产时,MQ内部针对每条生产者发送的消息生成一个inner-msg-id,作为去重的依据(消息投递失败并重传),避免重复的消息进入队列;

在消息消费时,要求消息体中必须要有一个bizId(对于同一业务全局唯一,如支付ID、订单ID、帖子ID等)作为去重的依据,避免同一条消息被重复消费。

四丶如何处理消息丢失的问题 (如何保证消息的可靠传输)?

这个丢数据,mq一般分为两种,要么是mq自己弄丢了,要么是我们消费的时候弄丢了。

用rabbit举例

(1)消息持久化

(2)ACK确认机制

(3)消息补偿机制

(4)设置集群镜像模式

五丶消息如何分发?

若该队列至少有一个消费者订阅,消息将以循环(round-robin)的方式发送给消费者。每条消息只会分发给一个订阅的消费者(前提是消费者能够正常处理消息并进行确认)。

六丶消息队列有哪些配置

<beans  xmlns="http://www.springframework.org/schema/beans"  
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:rabbit="http://www.springframework.org/schema/rabbit" xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/rabbit  http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd">  
<!-- 定义RabbitMQ的连接工厂 -->  
<rabbit:connection-factory id="connectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
    <constructor-arg value="10.130.202.12"><!--服务器ip地址-->  
    <property name="username" value="tele-onlineYa">
    <property name="password" value="tele-onlineYa">
    <property name="port" value="5678">
    <property name="channelCacheSize" value="50"> <!--通道缓存大小-->
<property name="virtualHost" value="tele-onlineYa"> </bean> <!--通过指定admin信息,当前producer中的exchange和queue会在rabbitmq服务器上自动生成。 --> 

<rabbit:admin connection-factory="connectionFactory" /> <!-- 队列queue,自动声明 -->

<rabbit:queue name="ZL.SALETRACE" exclusive="false" auto-declare="false" durable="true" /> <!--自定义消息接受者-->

<bean id="messageReceiver" class="com.zlf.cn.api.RabbitMqConsumerListener"> <!-- queue监听器,观察监听模式。当有消息到达本应用时会通知监听在对应队列queue上的监听对象 -->

<rabbit:listener-container connection-factory="connectionFactory"> <rabbit:listener queues="ZL.SALETRACE" ref="messageReceiver" />
</rabbit:listener-container>

</beans>

dubbo

一丶简单说一下dubbo

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)

其核心部分包含:

1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。

2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。

3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

二丶dubbo调用关系说明

(1)服务提供者在启动时,向注册中心注册自己提供的服务。

(2)服务消费者在启动时,向注册中心订阅自己所需的服务。

(3)注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

(4)服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

(5)服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

三丶你配置过dubbo哪些东西

# 应用名
dubbo.application.name = dubbodemo-consumer
# 注册中心地址
dubbo.registry.address = zookeeper://localhost:2181
# 调用协议地址 dubbo.protocol.name = dubbo dubbo.protocol.port = 28080
# 设置服务端和消费端连接超时时间
spring.dubbo.consumer.timeout=30000
spring.dubbo.provider.timeout=30000
服务端要声明暴露的服务接口
消费端要配置调用哪些服务


MySQL

一丶MYSQL有哪些索引?
https://blog.csdn.net/liutong123987/article/details/79384395



原文地址:https://www.cnblogs.com/caolyl/p/10334504.html