1.常见的模板引擎
2.Lock与synchronized有以下区别
1)Lock是一个接口,而synchronized是关键字。
2)synchronized会自动释放锁,而Lock必须手动释放锁。
3)Lock可以让等待锁的线程响应中断,而synchronized不会,线程会一直等待下去。
4)通过Lock可以知道线程有没有拿到锁,而synchronized不能。
5)Lock能提高多个线程读操作的效率。
6)synchronized能锁住类、方法和代码块,而Lock是块范围内的
3.shiro登录的执行流程
创建 AuthenticationToken,然后调用 Subject.login 方法进行登录认证;
Subject 委托给 SecurityManager;
SecurityManager 委托给 Authenticator 接口;
Authenticator 接口调用 Realm 获取登录信息。
4.shiro身份认证Authentication 和 授权Authorization
在shiro的用户权限认证过程中其通过两个方法来实现:
1、Authentication:是验证用户身份的过程。重写doGetAuthenticationInfo()方法
2、Authorization:是授权访问控制,用于对用户进行的操作进行人证授权,证明该用户是否允许进行当前操作,如访问某个链接,某个资源文件等,重写doGetAuthorizationInfo()
3、实现权限is or需要重写AuthorizationFilter中的isAccessAllowed(),循环遍历角色的权限数组,只要包含其一就返回true
其他组件:
除了以上几个组件外,Shiro还有几个其他组件:
1、SessionManager :Shiro为任何应用提供了一个会话编程范式。
2、CacheManager :对Shiro的其他组件提供缓存支持。
3、remenberMe:记住我
5.为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里
Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。
6. Redis数据淘汰机制
在 redis 中,允许用户设置最大使用内存大小 server.maxmemory,在内存限定的情况下是很有用的。譬如,在一台 8G 机子上部署了 4 个 redis 服务点,每一个服务点分配 1.5G 的内存大小,减少内存紧张的情况,由此获取更为稳健的服务。
内存大小有限,需要保存有效的数据?
redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。
Redis提供了以下几种数据淘汰策略:
1、 volatile-lru:从设置过期的数据集中淘汰最少使用的数据;
2、volatile-ttl:从设置过期的数据集中淘汰即将过期的数据(离过期时间最近);
3、volatile-random:从设置过期的数据集中随机选取数据淘汰;
4、allkeys-lru:从所有 数据集中选取使用最少的数据;
5、allkeys-random:从所有数据集中任意选取数据淘汰;
6、no-envicition:不进行淘汰;
7.数据库插入几百万数据怎么实现?
批量操作,变多次提交为一次,获取一次连接,执行多次插入。在代码中使用循环插入数据,最后关闭连接。
像这样的批量插入操作能不使用代码操作就不使用,可以使用存储过程来实现。
8.说一下Spring中的两大核心?
Spring是什么?
spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架(相对于重量级的EJB),主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,ibatis框架等组合使用。
1、IOC(Inversion of Control )或DI(Dependency Injection)
IOC控制权反转
原来:我的Service需要调用DAO,Service就需要创建DAO
Spring:Spring发现你Service依赖于dao,就给你注入.
核心原理:就是配置文件+反射(工厂也可以)+容器(map)
2、AOP:面向切面编程
核心原理:使用动态代理的设计模式在执行方法前后或出现异常做加入相关逻辑。
我们主要使用AOP来做:
1、事务处理
2、权限判断
3、日志
9.说说常见的集合有哪些吧
Map接口和Collection接口是所有集合框架的父接口:
Collection接口的子接口包括:Set接口和List接口
Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等
Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
10.MySQL 的数据量和并发量有多大?
关于容量:单表行数超过 500 万行或者单表容量超过2GB,此时就要答分库分表的中间件了!那后面题目的走向就变为mycat、sharing-jdbc等分库分表中间件的底层原理了!
关于并发量:如果并发数过1200,此时就要答利用MQ或者redis等中间件,作为补偿措施,而不能直接操作数据库。那后面的题目走向就是redis、mq的原理了!
评注:此题为走向题,你的回答不同,后面问题走向就变了。
11.MyBatis 定义的接口,最终怎么找到实现的?
回答:一共五步
1. Mapper 接口在初始SqlSessionFactory 注册的。
2. Mapper 接口注册在了名为 MapperRegistry 类的 HashMap中, key = Mapper class value = 创建当前Mapper的工厂。
3. Mapper 注册之后,可以从SqlSession中get
4. SqlSession.getMapper 运用了 JDK动态代理,产生了目标Mapper接口的代理对象。
5. 动态代理的 代理类是 MapperProxy ,这里边最终完成了增删改查方法的调用。
12.描述下网页一个 Http 请求,到后端的整个请求过程
利用DNS进行域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户
13.线程池的机制
在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,所以出现了池化技术!。
简单的线程池包括如下四个组成部分即可:
• 线程池管理器(ThreadPoolManager):用于创建并管理线程池
• 工作线程(WorkThread): 线程池中线程
• 任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行
• 任务队列:用于存放没有处理的任务。提供一种缓冲机制
14.多线程的常用方法和接口类
常用方法:
start,run,sleep,wait,notify,notifyAll,join,isAlive,currentThread,interrupt
常用接口类:
Runnable、Callable、Future、FutureTask
15.SpringBoot中starter原理
starter中简单来讲就是引入了一些相关依赖和一些初始化的配置。
为什么加了@Configuration注解还是要配置META-INF/spring.factories呢?因为springboot项目默认只会扫描本项目下的带@Configuration注解的类,如果自定义starter,不在本工程中,是无法加载的,所以要配置META-INF/spring.factories配置文件,这个由@EnableAutoConfiguration帮我们实现
16.spring boot注解
@SpringBootApplication:申明让spring boot自动给程序进行必要的配置,这个配置等同于:
@Configuration ,@EnableAutoConfiguration 和 @ComponentScan 三个配置。
@ComponentScan:让spring Boot扫描到Configuration类并把它加入到程序上下文。
@Configuration :等同于spring的XML配置文件;使用Java代码可以检查类型安全。
@EnableAutoConfiguration :自动配置。
17.spring 是如何创建bean的
在IoC容器中,bean的获取主要通过BeanFactory和ApplicationContext获取,这里ApplicationContext实际上是继承自BeanFactory的,两者的区别在于BeanFactory对bean的初始化主要是延迟初始化的方式,而ApplicationContext对bean的初始化是在容器启动时即将所有bean初始化完毕。
18.索引的概念
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。采取的是空间换时间的概念。
MyISAM引擎和InnoDB引擎使用B+Tree作为索引结构
19.mysql索引?
1)普通索引,这是最基本的索引,它没有任何限制,比如上文中为title字段创建的索引就是一个普通索引,MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引。
2)唯一索引,与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。
3)全文索引(FULLTEXT),对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。
4)单列索引、多列索引,多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。
5)组合索引(最左前缀),平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引
20.数据库查询优化
1)避免全部扫描,比如对null值进行筛选判读;使用!=或<>、like、or等等都将放弃索引全表扫描
2)考虑在where及order by涉及的列上建立索引
3)使用正向逻辑(not in,not exists)
4)数据库不擅长运算,把运算交给逻辑代码,非要有把运算放在右边
5)合理建表,使用合理的字段,善用非空、外键约束保证数据的完整性
6)索引并不是越多越好,一个表最好不要超过6个,多了影响增、删、改的性能。这个影响很大
7)多从业务逻辑方面考虑问题,合理使用中间件
8)对于数据量太大的数据分库分表,使用中间件比如mycat