Spring
1.Spring核心
控制反转(IoC):一个对象依赖的其他对象将会在容器的初始化完成后主动将其依赖的对象传递给它,而不需要这个对象自己创建或者查找其依赖的对象。
依赖注入(DI):组件之间依赖关系由容器在运行期决定,即由容器动态的将某个依赖关系注入到组件之中。依赖注入是实现控制反转的方法和手段,常见实现方式有setter注入、构造方法注入、注解注入。
面向切面编程:好比将系统按照功能分类,每个类别就是一个“切面”,我们再针对不同的切面制定相应的规则。
2.@value注解的作用
基于@value注解可以读取Properties配置文件
3.Spring通知类型:
前置通知:在目标方法执行之前执行的通知。
环绕通知:在目标方法执行之前和之后都可以执行额外代码的通知。
后置通知:目标方法执行之后执行的通知。
异常后通知:在方法抛出异常退出时执行的通知。
最终通知:在某连接点正常完成后执行的通知。
4.依赖注入
组件之间的依赖关系由容器在运行期决定,即由容器动态的将某个依赖关系注入到组件中。为了提高组件重用的频率和系统的灵活性、可扩展性。
5.component和bean有什么区别:
Component通常是通过类路径扫描来自动侦测和装配对象到spring容器;
Bean是告诉spring这是某个类的实例,当我需要用它时把它给我。比如引用第三方库中的类需要装配到spring容器里,只能通过bean实现。
6.Bean的作用域:
单例:整个应用程序,只创建bean的一个实例
原型:每次注入都会创建一个新的bean实例
会话:每个会话创建一个bean实例,只在web系统中有效
请求:每个请求创建一个bean实例,只在web系统中有效 默认是单例模式。
7.什么是spring的内部bean:
当一个bean仅被用作另一个bean的属性时,它能被声明成一个内部bean。
8.spring的注入方式:
Setter注入、构造方法注入、注解注入、静态工厂注入、实例工厂注入
9.Spring的jdbcTemplate对象和JDBC有什么区别:
JdbcTemplate是对JDBC API的封装,提供更多的功能和更便利的操作:
线程安全;
实例化操作简单,只需要传递datasource;
自动完成资源的创建和释放;
创建一次jdbcTemplate,到处可用,避免重复开发。
10.Spring实现事务的方式:
编程式事务和声明式事务
11.bean的生命周期:
创建:
(1)实例化bean
(2)设置对象属性(依赖注入)
(3)处理Aware接口,传递bean的id值、spring工厂自身,spring上下文
(4)如果想对bean进行一些自定义处理,可以让bean实现beanpostprocessor接口。
(5)initializingBean与init-method,如果bean在spring配置文件中配置了init-method属性,则会自动调用其配置的初始化方法。
(6)如果实现了beanpostprocessor接口,将会调用postprocessafterinitialization方法。 使用:
(7)disposablebean:当bean不需要时,会经历清理阶段,若实现了这个接口,会调用其实现的destroy方法
(8)destroy-method:最后如果这个bean的spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。
12.spring、springboot、springcloud区别:
(1)spring是整个spring生态的基础。
(2)springboot是一个快速开发框架,让开发者可以迅速搭建一套spring应用程序,并将spring模块和第三方模块很好的集成,而且默认支持json格式,可以使用前后端分离开发。
(3)springcloud是一套整合了分布式应用常用模块的框架,使开发者可以快速实现微服务应用。
13.spring中都使用了哪些设计模式:
(1)工厂模式:通过beanfactory、applicationcontext来创建bean都属于工厂模式;
(2)单例、原型模式:创建bean时默认是单例模式;
(3)观察者模式:spring可以定义一下监听;
(4)责任链模式:面向切片编程拦截器的执行;
(5)策略模式:在创建代理类时,如果代理的接口使用的是JDK自身的动态代理,如果不是接口则使用的是CGLIB实现的动态代理。
Springmvc
1.Spring MVC 工作流程:
前端控制器接受请求,通过映射到IOC容器中获得相应的controller对象和method方法,在方法中进行业务逻辑处理组装数据,组装完数据之后把数据发给视图解析器,视图解析器根据数据和页面信息生成最终的页面,然后再返回给客户端。
2.POJO和JavaBean有什么区别:
Pojo(普通的java对象)是普通Java类,具有getter/setter方法的普通类都可称作pojo
Javabean是Java语言中的一种可重用组件。
1.这个类必须有一个公共的缺省构造函数。
2.这个类的属性使用getter和setter来访问,其他方法遵从标准命名规范。
3.这个类应是可序列化的。
3.requestmapping注解的常用属性有哪些:
Value:指定url请求的实际地址
Method:指定请求的method类型
Params:指定请求参数中必须包含的参数名称,如果不存在则无法调
4.HTTP状态码:
400:错误请求;401:未授权;403:禁止访问;500:服务器内部错误;502:错误网关;504:网关超时
5.forward和redirect有什么区别:**
Forward:请求转发,是服务器请求资源,服务器直接访问把请求的资源转发给浏览器,浏览器不知道服务器的内容的来源,可以共享request里的数据
Redirect:重定向,是服务器发送一个状态码告诉浏览器重新请求新的地址,因此地址栏显示的新的url,不可共享数据,效率上比forward低。
6.拦截器的使用场景:**
日志记录:可用于记录请求日志,便于信息监控和信息统计;权限检查:可用于用户登陆状态的检查;统一安全处理:可用于统一的安全校验或参数加密/解密。
7.validated和valid有什么区别:**
二者都用于参数的校验,不同的是valid是hibernate提供的校验机制,validated是spring提供的校验机制,对前者进行了二次封装,提供了分组功能,可以在参数验证时,根据不同分组采用不同的验证机制。
8.springmvc获取request方法:
(1)从请求参数中获取
(2)通过requestcontextHolder上下文获取request对象
(3)通过自动注入的方式
Mybatis
1.Mybatis执行流程:
(1)首先加载mapper配置的SQL映射文件,或者是注解的相关SQL内容;
(2)创建会话工厂,mybatis通过读取配置文件的信息构造出会话工厂;
(3)创建会话,根据会话工厂,mybatis通过它来创建会话对象;
(4)创建执行器,使用数据库执行器executor执行操作数据库;
(5)封装sql对象,包括SQL语句、输入参数映射信息、输出结果映射信息;
(6)操作数据库,拥有了执行器和SQL封装对象,访问数据库并返回操作结果。
2.mybatis里#{}和${}的区别:
都是mybatis的占位符,#{}在预编译阶段生效,此时会将sql中的#换成?,调用preparedStatement的set方法来赋值;${}变量是在动态sql解析阶段生效,直接进行字符串替换;#{}很大程度防止了sql注入。
3.mybatis中的dao接口和xml文件的sql是如何建立关系的:
(1)解析xml,初始化sqlsessionfactorybean会将mapperlocation路径下的所有xml进行解析,创建sqlsource和mappedstatement。(2)dao接口代理,spring中的factorybean和jdk动态代理返回了可以注入的一个dao接口的代理对象。(3)执行,通过statement全限定类型+方法名拿到mappedstatement对象,通过执行器executor去执行具体的sql并返回。
4.mybatis的一级缓存和二级缓存:
一级缓存是sqlsession级别,默认开启且不能关闭,一级缓存的作用域是sqlsession范围内,不同的sqlsession之间缓存数据区域互不影响。二级缓存是mapper级别,默认关闭,使用时多个sqlsession使用同一个mapper的sql语句操作数据库,得到的数据会存在二级缓存区。使用hashmap进行数据存储