**前端
Java常见面试题目考点(四) java
一、谈谈你对Spring的理解web
Spring容器的主要核心是:控制反转(IOC), 依赖注入(DI)和面向切面(AOP)面试
① 控制反转: 传统的java开发模式中,当须要一个对象时,咱们会本身使用new或者getInstance等直接或者间接调用构造方法建立一个对象。而在spring开发模式中,spring容器使用了工厂模式为咱们建立了所须要的对象,直接调用就能够了;redis
② 依赖注入: spring使用javaBean对象的set方法或者带参的构造方法为咱们在建立所需对象时将其属性自动设置所须要的值的过程,就是依赖注入的思想。spring
③ 面向切面编程: 将一个个的对象某些相似的方面横向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等,底层是动态代理。sql
spring的启动过程?数据库
① 建立全局的上下文环境,这个上下文就是ServletContext;编程
② 在web容器启动时,会触发容器初始化事件, 其contextInitialized方法会被调用,在这个方法中,spring会初始 化一个启动上下文,这个上下文被称为根上下文,即WebApplicationContext;设计模式
③ 监听器初始化完毕后,开始初始化web.xml中配置的Servlet。
二、Spring中的几种设计模式?**
① 单例模式: spring的配置文件中设置bean默认为单例模式, spring中有两种代理方式,若目标对象实现了若干接口,spring使用jdk的类代理, 没有实现任何接口,spring使用CGLIB库生成目标类的子类;
② 模板方式模式——用来解决代码重复的问题。好比:RestTemplate, 当咱们从服务消费端去调用服务提供者的服务的时候,使用了RestTemplate;
③ 前端控制器模式——spring提供了前端控制器DispatherServlet来对请求进行分发;
④ 试图帮助(view helper)——spring提供了一系列的JSP标签,高效宏来帮助将分散的代码整合在试图中;
⑤ 依赖注入——贯穿于BeanFactory/ApplacationContext 接口的核心理念;
⑥ 工厂模式——在工厂模式中, 经过使用同一个接口来指向新建立的对象。Spring中使用beanFactory来建立对象的实例。
三、bean的生命周期?**
单例对象:scope="singleton",一个应用只有一个对象的实例。它的做用范围就是整个应用。
生命周期:
对象出生:当应用加载,建立容器时,对象就被建立了。
对象活着:只要容器在,对象一直活着。
对象死亡:当应用卸载,销毁容器时,对象就被销毁了。
多例对象:scope="prototype",每次访问对象时,都会从新建立对象实例。
3.一、BeanFactory和FactoryBean的区别?
BeanFactory是IOC最基本的容器,负责生产和管理bean,它为其余具体的IOC容器提供了最基本的规范,FactoryBean是一个接口,当在IOC容器中的Bean实现了FactoryBean后,经过getBean(String BeanName)获取到的Bean对象.( 并非FactoryBean的实现类对象,而是这个实现类中的getObject()方法返回的对象。)
四、Spring的经常使用注解
注解装配在 spring 中默认是关闭的。必须在 Spring 配置文件中配置 <context:annotation-config/>元素,开启注解装配。
1、用于装配Bean的注解**
@Component(value=”xxx”): 把资源让spring来管理。至关于在xml中配置一个bean。value能够省略,value的属性值做为bean的id;
@Component的三个衍生注解:
@Controller(value=”xxx”):通常用于将表现层装配到容器中,使用方法和@Componet同样;
@Service(value=”xxx”):通常用于将业务层装配到容器中,使用方法和@Component同样;
@Repository(value=”xxx”):通常用于将持久层装配到容器中,使用方法和@Component同样。
2、用于属性注入的注解**
@Autowired:只能按照bean类型注入,若是有多个类型匹配,默认将属性名称做为id去容器中查找;
@Qualifier:通常和@Autowired配合使用,用来注入指定id的bean,作方法的参数中能够独立使用;
@Resource:用来注入指定id的bean类型,至关于@Autowired+@Qualifier;
@Value:只能注入基本类型等数据,不能注入bean类型,可使用${}在资源文件中获取数据,前提是,外部资源文件被加载。
3、做用域**
@Scope:用于指定bean的做用域,通常就是singleton和prototype
4、生命周期相关的
@PostConstruct:用于指定某一个方法为初始化方法;
@PreDestroy:用于指定某一个方法为销毁方法。
5、其余配置类相关的**
@Configuration:声明一个类为配置类,用于替代applicationContext.xml的;
@ComponentScan:用于开启注解扫描的包;
@Import:用于导入其余类的;
@PropertySource:用于加载外部资源文件的;
@Bean:用于将方法返回的bean类型的对象装配到容器中。
6、Junit相关的**
@RunWith:用于加载配置文件,初始化spring容器的;
@ContextConfiguration:用于指定配置文件或者配置类的。
五、spring的事务传播特性?**
① PROPAGATION_REQUIRED: 若是存在一个事务,则支持当前事务。若是没有事务则开启;
② PROPAGATION_SUPPORTS: 若是存在一个事务,支持当前事务。若是没有事务,则非事务的执行;
③ PROPAGATION_MANDATORY: 若是已经存在一个事务,支持当前事务。若是没有一个活动的事务,则抛出异常;
④ PROPAGATION_REQUIRES_NEW: 老是开启一个新的事务。若是一个事务已经存在,则将这个存在的事务挂起;
⑤ PROPAGATION_NOT_SUPPORTED: 老是非事务地执行,并挂起任何存在的事务;
⑥ PROPAGATION_NEVER: 老是非事务地执行,若是存在一个活动事务,则抛出异常;
⑦ PROPAGATION_NESTED:若是一个活动的事务存在,则运行在一个嵌套的事务中. 若是没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。
六、HTTP/1.1与HTTP/1.0的区别?**
① 可扩展性: HTTP/1.1 在消息中增长版本号和OPTIONS方法, 它用于获取当前URL所支持的方法。若请求成功,则它会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET, POST”;
② 缓存: HTTP/1.1 在 1.0 的基础上加入了一些 cache 的新特性;
③ 带宽优化: HTTP/1.1中在请求消息中引入了range头域,它容许只请求资源的某个部分;
④ 长链接: 在一个TCP链接上能够传送多个 HTTP 请求和响应,减小了创建和关闭链接的消耗和延迟。
6.一、HTTP与HTTPS有什么区别?
HTTP是一个客户端和服务器端请求和应答的标准, HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层区别主要以下:
① https协议须要到ca申请证书,通常免费证书较少,于是须要必定费用;
② http是超文本传输协议,信息是明文传输,https则是具备安全性的ssl加密传输协议;
③ http和https使用的是彻底不一样的链接方式,用的端口也不同,前者是80,后者是443;
④ http的链接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
七、http常见的状态码有哪些?
200 OK //客户端请求成功;
301 Moved Permanently(永久移除),请求的URL已移走。Response中应该包含一个Location URL, 说明资源如今所处的位置 ;
302 found //重定向;
400 Bad Request //客户端请求有语法错误,不能被服务器所理解;
401 Unauthorized //请求未经受权,这个状态代码必须和WWW-Authenticate报头域一块儿使用;
403 Forbidden //服务器收到请求,可是拒绝提供服务;
404 Not Found //请求资源不存在,eg:输入了错误的URL;
500 Internal Server Error //服务器发生不可预期的错误;
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常;
八、Mybatis的编程步骤是什么样的?
① 建立SqlSessionFactory
② 经过SqlSessionFactory建立SqlSession
③ 经过sqlsession执行数据库操做
④ 调用session.commit()提交事务
⑤ 调用session.close()关闭会话
九、Redis的持久化?
①RDB 持久化:该机制能够在指定的时间间隔内生成数据集的时间点快照, 很是适合用于进行备份, 能够最大化 Redis 的性能;
②AOF 持久化:记录服务器执行的全部写操做命令,并在服务器启动时,经过从新执行这些命令来还原数据集,使用 AOF 持久化会让 Redis 变得很是耐久, 对于相同数量的数据集而言,AOF文件一般要大于RDB文件, AOF在运行效率上每每会慢于RDB;
③无持久化:让数据只在服务器运行时存在。
二者的区别:
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操做过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换以前的文件,用二进制压缩存储。
AOF持久化以日志的形式记录服务器所处理的每个写、删除操做,查询操做不会记录,以文本的方式记录,能够打开文件看到详细的操做记录。
9.一、Redis有哪几种数据结构?
String——字符串,hash(键值对),list(列表),set(集合),zset(有序集合)
9.二、Redis常见的性能问题都有哪些?如何解决?**
(1)Master写内存快照, 会阻塞主线程的工做;
(2)Master AOF持久化,若是不重写AOF文件,AOF文件过大会影响Master重启的恢复速度;
(3)Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源;
(4)Redis 主从复制的性能问题,为了主从复制的速度和链接的稳定性,Slave 和 Master 最好在同一个局域网内。
9.三、redis存满以后的解决方案?**
① 增长内存,由于redis是基于内存的k-v键值对存储的,内存越大,可存储的数据越多;
② 使用内存淘汰策略: 修改redis.conf中maxmemory-policy选项,设置删除redis键的淘汰规则, redis中并不会准确的删除全部键中最近最少使用的键,而是随机抽取3个键,删除这三个键中最近最少使用的键;
③ 集群:设置redis主从,避免redis单点故障,构建读写分离架构,知足读多写少的应用场景, 即便有了主从复制,每一个数据库都要保存整个集群中的全部数据,容易造成木桶效应, 这时要用到分片集群,全部的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.,客户端与redis节点直连,不须要中间proxy层.客户端不须要链接集群全部节点,链接集群中任何一个可用节点便可。
十、数据库的分库分表?**
当数据比较大的时候,对数据进行分表操做,首先要肯定须要将数据平均分配到多少张表中,也就是:表容量。
10.一、用户中心数据库切分方法|范围法
以用户中心的业务uid为划分依据,将数据水平切分到两个数据库实例上去,user_db1存储0到1千万的uid数据,user_db2存储1到2千万的数据切分策略简单,扩容简单,数据量和请求量不均匀
10.二、用户中心数据库切分方法|哈希法
以用户中心的业务uid为划分依据,将数据水平切分到两个数据库实例上去, user_db1存储uid%2=0的数据,user_db2存储uid%2=1的数据
切分策略简单,数据量和请求量均匀,扩容麻烦,增长一个库须要从新hash。
垂直分库就是根据业务耦合性,将关联度低的不一样表存储在不一样的数据库。作法与大系统拆分为多个小系统相似,按业务分类进行独立划分。与"微服务治理"的作法类似,每一个微服务使用单独的一个数据库。