赞
踩
1.什么是线程池?
线程池就是事先将创建好的线程进行整合,当需要使用的时候,直接拿出来进行使用,不用现去创建,可以节约开辟的时间,提高效率。
2.线程池有哪些种类?
在java.util.concurrent.Executors包中提供了许多静态方法。
Executors.newsingleThreadPool 单例线程池
Executors.newFixedThreadPool 定长容量的线程池
Executors.newSechodedThreadPool 执行周期任务的线程池
Executors.newCachedThreadPool 可缓存线程池
3.线程池的工作原理
当首次进行execute提交任务时,才会去创建线程。首先是由核心线程来执行。当核心线程都被使用时,会进入等待队列中进行缓存,当等待队列中满了后,就会由救急线程来进行执行。当前方都满了,就会执行拒绝策略,默认是抛出一个异常。
4.线程池的核心参数
corePoolSize 核心线程数
maxmumPoolSize 最大线程数 核心+救急
workQure 等待队列 keepAliveTime 救急线程生存时间
unit 时间单位 unit 时间单位
threadFactory 线程工厂 workQueue 等待队列
handleExecutor 拒绝策略 ThreadFactory 线程工厂
handler 拒绝策略
5.springmvc的工作流程
用户发送请求,dispatcherservlet前端控制器进行接收,它属于一个调度中心。调用handlemapping处理器映射器,返回一个handleExecutorchain对象,它里面就是包含了一个controller对象。返回给dispatcherServlet。再次调用handleadptor,处理器适配器,将处理器包装为适配器,他会找到对应的controller进行逻辑执行,返回一个modelandview对象给前端控制器。如果先后端不分离,就会调用viewresover试图解析器,将对象解析为view对象,将mode数据渲染到试图上,然后返回。先后端分离,就可以直接responsebody返回json数据给前端。
6.springmvc常用的注解,spring........注解
@RestController
@Service
@Mapper
@Autowired
@SpringBootApplication
@RequestMapping
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PathVarible
@RequestParam
@Param
@Aspect
@Around .....
@Bean
@Configuration
@Data
@Sl4J
@Component
7.spring中bean的生命周期
0 首先要对bena的基本信息进行封装,bean的全部信息封装为一个beanDifination对象
1 调用构造方法,进行实例化
2 set注入,依赖注入,常用的autowired就是这一步
3 aware结尾的接口是否实现,如果实现就要重新方法
4 beanPostProcossor before 前置处理器
5.是否自定义init方法,是否实现initiatingIiitialingBean接口,是否使用beanConstruct@PostContruct注解
6.beanPostProcossor after前置处理器的后置处理器,此处对bean进行增强,可以产生代理对象。 CGlib代理对象
7.销毁
8.spring中事务是怎么实现的
aop实现,在调用方法前开启事务,对方法前后进行拦截,try catch 一下,执行后,如果抛出运行时异常,进进行回滚,无异常提交。
9.spring中事务失效的场景
1.默认只会处理运行时异常,会对运行时异常进行捕获。如果出现异常自己进行catch处理后,也要抛出运行时异常
2.抛出检索异常检查异常,要想进行回滚,可以设置注解的rebackFor 为 Exception.class
3.方法前要使用public修饰。
10.spring中的bean是线程安全的吗?
不是安全的。如果说bean是无状态的那就是安全的。所谓无状态就是他的成员没有被修改,那么注入这种无状态的bean,就是线程安全的。所以就是说某种程度上来说是安全的。
不安全的时候,如果在bean中定义了可修改的成员变量,可以scope改变bean的模式有singlton改为prototype多例的。或者自己加锁实现。
11.什么事aop,是否使用过?
aop是面向切面编程,把公共代码进行抽离方便复用,且可以不改变原代码逻辑。
使用过,例如使用的事务底层就是aop实现。或者记录操作日志
使用切点表达式+环绕通知,也可以自定义注解切点表达式可以使用路径名或者自定义注解。可以获取到很多参数,例如:入参,类名,方法名,返回值,注解,请求方式,信息等
12.springboot自动配置的原理
我们在启动项目时会实例化bean交给springioc容器进行管理。所以就和启动项很密切,就要说到启动类的注解@SpringbootApplication注解。它封装了3个注解。@SpringBootConfiguration这个注解内部其实就是封装了@Configuration注解,标明这就是一个配置类。@ComponentScan注解就是包扫描,不重写的话,默认就是当前类下及其子包下都会扫描到,扫描哪些@Component注解的类,交给容器来管理。@Enable开头的注解,这个注解往往都和第三方的技术关联性很大。它里面封装了@Import注解,这个注解的参数有三种。.class,配置类,importSeletor接口实现类。在源码中是接口实现类这种。实现类中有个方法selectImports()方法,返回值是String[]数组,他会将一个文件转换为String数组,这个文件包含的就是第三方的依赖的全限定类名。要将这些类交给ioc容器来管理,但不是所有的bean都会被加载,因为有一些conditoinal修饰的,他会根据条件进行装配(环境中是否有class文件、是否有对应的bean、是否有对应的属性和值)。这个文件在mate-inf下的spring.factory文件和spring下有个import结尾的文件。
13.springboot中定时任务。
@Secheduled注解
14.springboot打成的jar包和普通的jar包的区别
打成的jar包是可以java -jar进行运行的。而普通的jar包时可以进行引用的,文件和包名一样。
15.RequestMapping和GetMapping的区别
他们功能很相似,可以说getmapping是requestmapping的特例,getmapping更具有语义化。
16.Springboot中的run方法做什么了?
IOC初始化的操作。
17.spring、springmvc、springboot的区别
spring有两大核心 di依赖注入 ioc控制反转目的:解耦。mvc的特点就是适合快速搭建web项目,利用dispatchservlet,modelandview,viewResolver一些简单的概念,来简化web开发 。springboot的特点是自动装配starter启动项,利用这两项来简化大量配置,快速构建项目,简化开发,简话配置代码,约定大于配置。
18.循环引用(循环依赖)讲解一下?具体?
两个bean相互引用,形成闭环,当然3个也行,1个也行。
绝大多说的循环依赖都可以由三级缓存来解决。
一级缓存:存放生命周期已经走完的bean。单利池
二级缓存:生命周期没有走完的半程bena。
三级缓存:一个bean的工程,可以生产代理对象和正常bean对象。ObjectFactories对象工厂
一级缓存+二级缓存就可以解决普通对象的循环依赖。
三级的出现,是为了解决代理对象的出现。这三级缓存可以解决大部分循环依赖(主要是bean生命周期中构造一下的循环引用)
19.如何实现的?
场景:A引用B,B引用A。
A首先进行实例化,原始对象A会生成一个ObjectFactories对象放入三级缓存。在实例化的过程中,需要依赖B对象,这时候就会把A放入三级缓存中。接着走B的逻辑,因为此时B不存在,所以B进行实例化,原始B会生成一个ObjectFactories对象放入三级缓存,B又需要依赖A,这时候就会到三级缓存中,由beanFactory生产A对象,此时可以是代理对象,接着把A放入二级缓存中。接着走B的逻辑,将A注入给B,B就可以初始化完成B创建成功,就会把B放入到一级缓存中。接着走A的逻辑,因为B已经初始化完成,所以A就可以直接引用B,来完成初始化,接着把A放入一级缓存中。接着将二级缓存中的B进行删除。
20.构造方法中出现循环引用,怎么办?
但是三级缓存解决不了构造方法中的引用。此时就需要使用@Lazy注解,懒加载,当什么时候用到,什么时候再进行加载。
21.如何定位慢查询?
可以使用mysql自带的explain来查看是否具有进一步的优化空间。 type、key、key_len等等
mysql中开启慢日志查询(一般调试阶段,接口设置为2秒响应)
当然也可以使用运维工具,检测接口的运行时长。
22.sql语句执行很慢,如何分析?
看是否命中索引,索引是否生效。key 和 key_len
看type是否有进一步优化的空间。 是否存在全盘扫描/全索引扫描
通过extra判断是否有回表情况。 如果出现回表,可以添加索引或修改返回字段来修复。其实就是覆盖索引。
索引这有机会再理解一下。
23.什么是索引?
是一种快速检索的数据机构,提高检索效率,采用的是B+树,这种树,层数低路径短,阶数高多,是一种矮胖的树
24.底层的数据结构是什么样的?
飞叶子节点存储指针,叶子节点存储数据。而且便于扫库区间扫描,因为叶子节点采用双向链表,可以快速检索。
25.什么是回表查询?
说到回表,就需要直到聚簇索引和非聚簇索引,聚簇索引指他的非叶子节点存储指针数据和索引放在一起,叶子节点存储的是整行的数据。非聚簇索引,索引和数据分开发非叶子节点存储的是整行数据的id。而回表指不能一次查询出结果,需要先进行非聚簇索引查出id,再有id查出聚簇索引的整行数据。
26.什么是聚簇索引?什么是非聚簇索引?
上方已经解释。
27.什么是覆盖索引?
所谓覆盖索引就是指可以不用回表就可以查出的数据,因为返回的数据中在索引中已经全部包含了。
28.索引的创建原则,什么情况使用?
数据量大30万,效果比较明显。
数据量大,查询频繁的表
连接条件,where,order group的字段
如果字符串必须是索引可以采用前缀索引。
区分度高的字段。
也要控制索引的数量,并不是越多越好,维护起来成本比较大。
尽量使用联合索引
如果字段不为空,可以加非空约束,添加约束。
29.mysql超大分页怎么处理?
采用覆盖索引+子查询。
30.什么情况下,索引失效?
首先违背最左原则。1,12,123,正常的。13只有1会执行,23都不会执行。
索引不能使用函数。
索引模糊查询 只有后%是好使的。
>= 这种范围查询 右边不能使用索引
字符串索引,不加'',造成索引失效。(类型转换异常)
31.事务的特性?
原子性、事务是最小操作单元,要么同时成功同时失败
一致性、
隔离性、不会受别的事务影响
持久性
32.并发事务会带来哪些问题?
脏读、不可重复读、幻读、
33.如何解决这个问题?
读未提交,读已提交、重复度、序列化
改变事务的隔离级别,默认是可重复度。但是解决不了幻读。需枷锁处理。
34.Mybatis的执行流程?
不太会。
1.读取MyBatis配置文件:mybatis-config.xml 加载运行环境和映射关系。
2.构造会话工程sqlSessionFactory,一个项目只有一个,是单例的,一般由spring管理
3.会话工厂创建sqlSession对象,包含了执行sql语句的所有方法。
4.操作数据库的接口,Executor执行器,同时负责查询缓存的维护。
5.Executor接口的执行方法中有一个MappedStatement类型的参数,封装了映射信息
6.输入参数映射 java -> 数据库
7.输出结果映射 数据 -> java
35.git指令
git init
git clone
git remote add origin 地址
git push --set-upstream master
git checkout -b 分支名
git checkout 分支名
git pull = git fetch + git merge
git push
git push origin master
git status
git-log
git reset --hard commitId
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。