关于java基础、多线程、JavaWeb基础、数据库、SSM、Springboot技术汇总
作者 : Stanley 罗昊
本人自行总结,纯手打,有疑问请在评论区留言
【转载请注明出处和署名,谢谢!】
一.java基础
1.多态有哪些体现形式?
重写、重载
2. Overriding的是什么?Overloading是什么?
Overriding是重写 Overloading是重载
3. 接口与抽象类的区别?
抽象类速度比接口快;
接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法;
抽象方法可以有main方法并且我们可以运行它;
接口没有main方法,因此我们不能运行它;
4. 接口在我们现实中的好处?
我们写方法的时候,应该先定义接口,再定义实现类,这样在后期改动的时候,接口可以有多个实现类,可以保证我们代码的灵活调用,不至于到后期维护的时候改动特别大,主要是提高了程序的灵活性;
5.java中的垃圾回收机制?
当我们对象创建之后呢,这个时候对象处于可答状态,就是可以被访问的状态,在这个时候呢,对象的生命过程它是属于可控制状态,但,当我们的对象比如在方法中定义的,那你方法调用完之后其实就已经没用了,那它就会处于不可答状态;
再举个例子,你new出来的一个对象,原本是你有值的,现在你又给它赋成null值了,那你new的那个对象,就已经成为垃圾了;
所以,那些不可答资源呢,就被称之为,垃圾资源,而这个垃圾资源呢,会被这个java中的垃圾回收器按照一定的原则进行回收,这个一系列的操作是由java虚拟机的内附进行操作的,在正常情况下,我们是无权干涉的;
6.int与integer的区别?
int的值存在栈里面,integer的值,存在堆里面;
integer是包装类,它是一个对象,可以赋空值,而int是基本数据类型是不能赋空值的;
二.多线程
1.多线程是干嘛的
多线程就是解决程序在使用过程中会出现一些并发操作;
如果出现并发了,怎么办?
可以做同步,使用synchronized关键字;
我们可以在方法上,或者在代码块上加上synchronized,这样的话,多个线程在同一个时间片就会只有一个线程能进来,这个就可以保证你程序中的数据共享问题得到足够的解决;
2.如果你使用synchronized的话,会影响效率,你如何解决?
如果出现这种情况的话,我们就可以使用乐观锁来解决;
乐观锁是在数据中存储的有一个状态,就是在数据库中,有一个状态列,当我在操作的时候呢。你如我现在准备向数据库中插入一条数据,这个时候,有一个状态在哪儿放着,如果我没操作完,其他人是不能操作的,这样的话可以保证,你都能进来,但是到数据库这儿,你被我卡死了,因为我还没干完呢,你就不能做;
乐观锁的概念就是从数据库的层面,然后呢,在数据库中加了一列,通过判断这一列的状态呢,来判断当前这个线程是否可以进行操作,如果当前线程没有操作完,下一个线程需要在后面等待,这个等待不是通过加锁来实现的,而是通过数据库的逻辑进行判断的;
说乐观锁的话,就可以在一定程度上的进行优化;
3.用队列的方式,利用队列的特性,先进先出;
三.Javaweb基础
1.什么是连接池?
Tomcat启动的时候,它就会给默认创建100个连接池【可以设置多个,当然有最大限制度】在哪儿放着,这就连接池;
连接池的好处呢?
有了连接池,它就可以保证你程序在执行过程中,你需要连数据拿东西了,就来池子里面拿一个,拿走你不用管,用完它就会自动还回去,那这个是不是就可以理解成一个无限循环的池子?这就是连接池;
2.什么是数据源?
在配置中,除了配置 数据库 用户名 密码 地址 意外还需要注意几项:
连接池的属性:
可以配置最大连接数
最大等待时间
最大连接时间
连接超时时间
3.通过Tomcat如何配置数据源?
在conf目录下的context.xml文件中
4.解释一下什么是JNDI?
J是java的意思, N是命名的意思,D是目录的意思,I是接口;
5.JSP的九大内置对象?
equest、response、session、application、out、pagecontext、config、page、exception
详细介绍:https://www.cnblogs.com/leirenyuan/p/6016063.html
6.servlet的生命周期?
Servlet的生命周期包含了下面4个阶段:
1.加载和实例化
2.初始化
3.请求处理
4.服务终止
7.什么是servlet?
Servlet是一个运行了面向请求/ 响应服务器中的网络模块。
请求是客户的一个调用,可能是远程的。
请求包含了客户要发送给服务器的数据。
响应是服务器返回给客户的回答该请求的数据。Servlet是一个JAVA对象,他以请求为输入,分析其数据,执行一些逻辑运算,并给客户发回一个响应。
另一方面,Servlet作为驻留在服务器端HTTP明白的中间层,它们知道怎样在HTTP中通过RMI或IIOP在EJB和客户之间进行通信。
8.Tomcat目录下有什么?分别是干嘛的?
bin目录:
里面存放可执行文件
lib目录:
存放jar包
conf目录
里面存放一些配置文件
temp目录
里面存放一些临时文件
webapps目录
项目存放地
work目录
work目录用来存放tomcat在运行时的编译后文件,例如JSP编译后的文件。
清空work目录,然后重启tomcat,可以达到清除缓存的作用logs目录
tomcat每次启动时,自动在logs目录下生产以下日志文件,按照日期自动备份。可以帮助我们更好的找出错误。
9.springboot微服务你了解过没有?
了解过,微服务呢,我们也做过,但是对于我们公司来说呢,还是以单体项目居多!
单体项目就是,我们这个项目没有涉及到那么高的并发量;
所以说,我们就做过一些单体项目;
但是呢,我们为了解决在单体项目中访问量较大的情况,我们在项目中也做过一些简单的集群,也能达到我们的项目需求;
四.数据库
1.什么是存储过程?
存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的
2.什么是触发器?
触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,是一种特殊类型的存储过程,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发。
3.什么是视图?
数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
五.Spring SpringMvc mybatis
1.聊聊Spirng
Spring呢,他是一个容器,对我我来说呢,我用它更多的是来做对象的管理,以及我们资源的整合。
比如说,我们用Spring中的IOC,用它来进行对象的注入,比如我们在分层开发的时候呢,我们可以让逐层对象之间的依赖关系交给spring来管理,spring呢就是通过ioc的方式来实现的;
注入的形式呢,一般上都是通过注解,当然呢,也可以通过配置文件通过配置bean的方式进行注解;
get set方式注入 或通过p命名空间进行注入,还有就是通过构造方法进行注入,一般呢,用的最多的还是通过注解进行注入;
Spring还有一个aop,面向切面;
当我们做程序的时候呢,我们可以在程序代码不做任何改动的情况下,我们在执行的目标方法之前,或者之后,我们可以用aop的形式呢,去植入一些增强代码,这就是aop;
好处呢?就是让我们的程序不做任何改动,我们可以随心所欲的去加入我们想要的东西;
aop呢,更多体现在声明式事物;
2.什么是声明式事物?怎么配置的?
里面需要先配置切面(跟那些方法加事物),第二呢,再去配置增强,第三呢,把增强和这个切入点呢进行一个整合,这个时候切面就配好了;
spring呢支持,注解式事物;
3.spring的定时任务,在什么场景下使用;
比如定时的删除数据
4.讲讲spring的声明式事物的传播机制是什么?
事务传播行为就是多个事务方法调用时,如何定义方法间事务的传播。Spring定义了7中传播行为:
(1)propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是Spring默认的选择。
(2)propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
(3)propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
(4)propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
(5)propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
(6)propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
(7)propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作。
5.spring的常用注解?
@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。
@Scope注解 作用域
@Lazy(true) 表示延迟初始化
@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Scope用于指定scope作用域的(用在类上)
@Scope注解 作用域
@Lazy(true) 表示延迟初始化
@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Scope用于指定scope作用域的(用在类上)
6.mybaits与其他持久层框架的对比
先讲讲mybaits的优点,再讲讲hibernate,然后再简单的聊聊JPA;
7.mybatis的执行原理?
先把sqlsessionfactory创建出来;
然后再创建sqlsession;
然后就调用sqlsession里面的一些方法,例如:
selectOne、liset、Delete,调用它们就可以实现增删改查;
8.mybatis主配置文件,里面都有什么信息项?
- 注册存放DB连接四要素的属性文件
- 注册实体类的权限定性类名的别名
- 配置MyBatis运行环境,即数据源与事务管理器
- 注册映射文件
9.mybatis中的一二级缓存
一级缓存是session级缓存,默认开启的,它会把我们已经查询过的数据呢,会缓存到session里面,但是如果是不同session,是不会共享的;
二级缓存是SessionFactory级别,它默认是不开启的,需要在主配置文件中开始;
你可以在某一个映射文件里,我可以指定我开启,我可以指定我使用缓存,当然,不是所有地方都用得到二级缓存;
一般,一些使用较为频繁的一些数据呢,使用二级缓存,当下次再来拿相同的数据时,不再将去访问数据库,而是从缓存中获取数据;
如果缓存的数据较多,也可以缓存到服务器的硬盘上;
六.SpringMvc的执行流程
一个请求过来,springmvc是如何处理的;
第一,它有一个核心的控制器DispatcherServlet,核心控制器呢,它需要判定我们当前的请求是否为一个springmvc请求,这个呢,需要跟我的配置文件去对比,或者呢,去跟我我们的注解去对比,注解里面有一个RequestMapping,跟它去对比,当然,一般情况下,我们用的都是以注解的形式;
一个请求来,它就开始去控制器中去找,如果找到与这个请求相匹配的,springmvc呢它会用一系列的转换器来进行初始化;
转换器是什么呢?
我们的请求里面如果有参数,这个转换器呢它负责把我的参数呢转换了一下,因为springmvc中的方法需要接收,比如说,传过来的参数是字符串,这我这个接收的时候用的是整数,这个时候,转换器就需要完成字符中跟整数的一个转换过程;
比如说,我请求的这个sprinmvc是一个文件上传,那么呢,它就需要把我解析我上传的这个文件,然后把我的这个文件通过转换器的形式呢,转换成springmvc能够识别的一个对象叫;
11.什么是springmvc拦截器,如何配置?
所谓的springmvc拦截器就是,一个用户请求过来,判断这个用户是否有权限访问我的控制器,如果没有权限,那么我将直接终止你对我的访问,如果有权限,那么就会被springmvc的转换器所拦截,所谓的转换器就是参数转换器;
最常见的一点就是,将你的参数封装到实体里面,需要让你的springmvc控制器呢能够顺利的获取参数,和使用参数;
12.转换器会转换失败吗?失败后发生什么?
如果我这个后台需要接收的是一个整数,你传过来一个abc,这个时候,转换器就会转换失败;
转换器转换失败的时候,这个时候,你的请求将被终止,直接返回;
转换器,转换成功的时候,它就会开始跳到你的控制器里,去执行你的service、执行你的页面跳转、执行你的业务逻辑,如果执行完了之后,就会需要进行页面跳转;
这个时候,我们就需要判定,当前返回的是JSON还是还是需要跳页面;
如果是跳页面的话,它需要根据springmvc配置那个静态资源的路径,去找我对应的页面;
那,如果没有呢?返回的是JSON的呢?
就把我们最后返回的集合,通过我们阿里巴巴的FastJson,通过这个打包工具呢,会把我们最后的独享转换成JSON字符串,最后返回到页面上解析;
13.简述springmvc执行流程
第一,先经过核心控制器(DispatcherServlet)检测是不是springmvc请求;
第二,需要通过拦截器来判定当前你的权限等等是否能够访问;
第三,需要通过转换器进行参数一系列转换;
第四,访问;
第五,返回并判断是JSON还是页面;
14.springmvc的全局异常是怎么处理的?
如果我在执行这个控制过程中,有没有可能我的代码执行的时候报500了?
有可能吧!
这个时候,springmvc就不会往下执行了,这个时候我们就需要配置一个全局异常处理,保证springmvc呢能够跳转到一个正常合法的页面;
15.springmvc中常见的注解?
@Controller
@RequestMapping
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
@Resource和@Autowired
@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。
1、共同点
两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。
2、不同点
(1)@Autowired
@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。
@requestParam
@requestParam主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter("name"),它有三个常用参数:defaultValue = "0", required = false, value = "isApp";defaultValue 表示设置默认值,required 铜过boolean设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。
@ResponseBody
作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
16.springmvc怎样进行数据校验?
JSR 303 用于对Java Bean 中的字段的值进行验证,使得验证逻辑从业务代码中脱离出来。是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回。一般用于表单提交页面(如用户名必填、只能由数字字母组成等等)。
17.springmvc怎么处理日期?
在实体类字段上加:
@DateTimeFormat(pattern="yyyy-MM-dd")
七.springboot
1.springboot如何配置数据源?
2.springboot如何配置两个数据源?
链接:https://www.cnblogs.com/fengmao/p/7538854.html
3.springboot如何读取属性文件?
一般是通过value,在类的属性上加一个value,括号里面呢这个value的值呢就写你配置文件里的值就可以了;
4.如何实现跨域?
JSONP,该协议的一个要点就是允许用户传递一个callback 参数给服务端。
利用<script>标签没有跨域限制的“漏洞”,来达到与第三方通讯的目的。当需要通讯时,本站脚本动态创建一个<script>元素,地址指向第三方的API网址
作者:罗昊
感谢各位阅读学习,
如果有疑问或纠错请在评论区留言与我交流,再次感谢各位读者的支持