1.Spring的两大核心思想?
-
IOC:控制反转
-
AOP:面向切面编程
2.IOC是什么?DI是什么?
-
IOC:控制反转,将创建对象的权利反转交由给Spring容器。
-
DI:是依赖注入,当获取某个资源对象需要依赖于其他资源对象的时候,Spring容器会帮你将需要的依赖资源准备好并注入通过特定的方式注入到该对象上。
3.AOP的作用是什么?应用场景是什么?
-
AOP的作用是在不改变业务代码的情况下增强横切逻辑功能
-
应用场景:事务,日志,权限控制等
4.Mybatis配置批量定义别名,扫描包时可以有重名的类么?
-
这是不可以的,会报错:别名已经被占用
5.ORM是什么?
-
关系对象映射:通过在java中调用api操作对象来达到操作数据表的目的(把对数据的操作转换为对对象的操作),如save(user),希望向user表中保存一条记录(实际底层还是操作数据库)
6.SpringMVC的作用是什么?SpringMVC是对谁的封装?
-
作用一:接收并转发请求
-
作用二:响应数据跳转页面
-
SpringMVC是对Servlet的封装
7.SpringMVC后台返回对象到前台以JSON字符串接收需要使用什么注解?
-
@ResponseBody
8.Mybatis中#和$取参的使用原则?当使用$接收简单数据类型时候参数名称如何定义?
-
原则:能用#{}不用${},#底层是预编译语句占位符,${}底层就是简单字符串拼接.
-
当使用${}接收简单数据类型时候参数名称固定为value
9.@Autowired和@Resorce区别?
-
Autowired默认是按照类型注入,是Spring提供的注解
-
Resource默认是按照bean的id注入,是jdk提供的注解
10.什么是Mybatis的延迟加载?
-
使用到关联对象数据的时候再去查询关联表
11.Mybatis多表关联一对一和一对多分别使用标签做结果集封装?
-
一对一使用association标签
-
一对多使用conllection标签
12.SpringMVC的三大件是什么?
-
处理器映射器
-
处理器适配器
-
视图解析器
13.Mybatis的mapper配置文件中增删改查分别是什么?
-
增加:<insert>
-
删除:<delete>
-
更新:<update>
-
查询:<selete>
14.Mybatis基础CRUD操作,查询单个对象和查询list集合分别调用SqlSession的什么API?
-
单个:selectOne
-
集合:selectList
15.Mybatis的别名定义使用什么标签?
-
<typeAliases>
16.SqlMapConfig.xml关联每一个sql映射文件使用什么标签,有哪几种方式?
使用<mappers>标签中的
<mapper>标签:
-
1):resource属性:路径(classpath)为xml映射文件的路径包名+文件名
-
2):url属性:路径(网络上的路径):路径对应的是网络上了某个文件,注解file://前缀+路径+文件名
-
3):class属性:class关联的是接口,写的是接口的全限定名
<package>标签:
-
4):name属性:关联的是包的路径名
17.Spring中Bean的作用域有哪些?默认是什么?
作用域:
-
单例:singleton
-
多例:prototype
-
请求作用域:request
-
会话作用域:session
默认是singleton单例
18.Spring中Bean的三种对象创建实例化方式?
-
1.构造器实例化:构造器实例化是指spring容器通过Bean对应的类中的默认无参构造器来实例化的bean,通过反射技术调用无参构造器实例化(推荐)
-
2.静态工厂方式实例化:使用一个静态工厂类的一个静态返回对象的方法返回bean对象的方式。
-
3.实例化工厂方式实例化:使用实例化工厂类的一个普通成员方法返回一个bean对象的方式。
19.怎么自定义SpringMVC异常处理器?
-
1.实现HandlerExceptionResolver接口
-
2.在配置文件中注册自定义处理器
20.Mybatis动态sql章节中涉及的标签有哪些?
-
<if>:test属性通过条件判断是否执行内部的语句
-
<choose>:相当于switch,<when>标签相当于case,<otherwise>标签相当于default
-
<where>:一般搭配if来使用,表示条件符合才添加sql的where关键字
-
<foreach>:循环遍历
-
<sql>:额外的sql语句,可以让其他语句包含进去
21.AOP通知(增强)类型?
-
before:前置通知(业务方法执行之前)
-
after:后置通知(业务方法执行之后)
-
afterReturning:最终通知(释放资源等)
-
afterThrowing:异常通知(出现异常的通知)
-
around:环绕通知(在一个方法中自定义4种类型通知)
22.什么是声明式事务?
-
使用xml配置或者注解控制的事务,而非编程式事务(业务代码中通过事务代码控制)
23.@Component@Controller@Service@Repository什么区别?
-
1.这四种注解功能上没有任何区别,都是将bean对象加入到spring容器中
-
2.@Controller@Service@Repository具有不同层的表述含义
-
3.@Component表示其他的bean对象注解
24.谈谈自定义SpringIOC的工作流程?
-
创建配置文件applicationContext.xml
-
编写配置文件(加入一些对象的配置信息)
-
Spring内部采用工厂模式,配合xml解析+反射技术,可以根据用户的配置,生成相应的对象
-
工厂提供一个getBean方法,从工厂中获取对象
-
操作对象的方法,属性
25.不使用注解的情况下,如果给对象注入值得话,你知道有几种方式?常用的是哪些?
1.set注值(重点)
2.构造器注值
3.名称空间p注值
26.Spring有注解方式和XML配置两种,两者有什么区别?你常用spring注解有哪些?
-
注解方式:
优点:
1.简化配置
2.使用起来直观且容易,提升开发效率
3.类型安全
缺点:
1.改变实现类比xml困难
-
xml方式:
优点:
1.类与类间的松耦合,容易扩展、更换
2.对象间的关系一目了然
缺点:
1.配置冗长,且还要额外多维护一份配置
2.类型不安全,complile无法帮忙校验,运行期才会发现错误
在公司主要使用的是注解开发,能够提高开发效率,在配置文件中把相关的注解扫描配置好,我们只要在自己写的类或者代码上边添加对应的注解就把事情解决了。
-
创建对象使用注解:@Component、@Repository、@Service、@Controller
-
依赖注入使用@Autowired按类型注入,@Reosource(name="")按id注入
27.谈谈spring的事务管理?
-
Spring声明式事务使用AOP机制去实现,AOP机制底层又依赖于动态代理技术
28.使用spring有什么好处?
-
1.方便解耦,简化开发(IOC)
通过Spring提供的IOC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过程程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需要编写代码,可以更专注于上层的应用。
-
2.AOP编程的支持(AOP)
通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
-
3.声明式事务的支持
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式灵活地进行事务的管理,提高开发效率和质量。
-
4.方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,在spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。
-
5.方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate,Hessian,Quartz)等的支持。
-
6.降低JavaEE API的使用难度
Spring对很多难用的JavaEE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些JavaEE API的使用难度大为降低。
29.SpringMVC的执行流程是什么?请简单阐述一下
-
SpringMVC流程:(按照自己的理解写:必做)
-
01、用户发送出请求到前端控制器DispatcherServlet。
-
02、DispatcherServlet收到请求调用HandlerMapping(处理器映射器)。
-
03、HandlerMapping找到具体的控制器(可查找xml配置或注解配置),生成处理器对象的执行链(如果有),再一起返回给DispatcherServlet。
-
04、DispatcherServlet调用HandlerAdapter(处理器适配器)。
-
05、HandlerAdapter经过适配调用具体的处理器(controller)。
-
06、Controller执行完成返回ModelAndView对象。
-
07、HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet。
-
08、DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)。
-
09、ViewReslover解析后返回具体View(视图)。
-
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
-
11、DispatcherServlet响应用户。
30.你常用的SpringMVC注解有哪些?如何开启SpringMVC的注解扫描?
常用的注解有:
-
@Controller:加在类上,用来指示该类是一个控制器类,使用注解可以使得该控制器支持同时处理多个请求动作,更加灵活。
-
@requestMapping:用于请求url映射
-
@RequestBody:注解实现接收http请求的json数据,将json数据转换为java对象。
-
@ResponseBody:注解实现将Controller方法返回对象转化为json响应给客户。
-
@ModelAttribute:共享参数数据的时候给参数换个名字
***注意:使用了@ModelAttribute 注解的方法会在Controller每个方法执行前被执行
-
@PathVariable:加在方法参数上,可以非常方便的获取请求URL中的动态参数(路径参数)
-
@MatrixVariable:加在方法参数上,拓展URL请求地址的功能,多个请求参数可用","分开,一般用于进行多条件的组合查询
***注意:
springMVC默认是不开启 @MatrixVariables 注解功能的
需要使用时,在 spring.xml 中更改为 < mvc:annotation-driven enable-matrix-variables="true" /> 开启注解功能
-
@CookieValue("参数名"):加在方法参数上,用于将请求的cookie数据映射到功能处理方法的参数上
-
@RequestAttribute:加在方法参数上,用于获取request作用域中的数据
-
@SessionAttribute:加上方法参数上,用于获取session作用域中的数据
-
@SessionAttributes:加上类上,允许我们有选择的指定Model中的哪些属性转存入session作用域中
SpringMVC开启注解:
<context:component-scan base-package="com.ujiuye.ssm" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
31.如何自动注解最合适的三大件?
HandlerMapper\HandlerAdapter\ViewResolver springmvc三大件
<mvc:annotation-driven /> 它会自动注册DefaultAnnotationHandlerMapping 与 AnnotationMethodHandlerAdapter
32.JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
①数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库连接。
②Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在xxxxmapper.xml文件中与java代码分离。
③向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决:Mybatis自动将java对象映射至sql语句。
④对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象。
33.MyBatis编程步骤是什么样的?
-
1.创建SqlSessionFactory
-
2.通过SqlSessionFactory创建SqlSession
-
3.通过sqlsession执行数据库操作
-
4.调用session.commit()提交事务
-
5.调用session.close()关闭会话
34.为什么说MyBatis是半自动ORM映射工具?它与全自动的区别在哪里?
Hibernate属于全自动ORM映射工具,使用Hibernate查询时sql语句可以由框架来生成,操作的可以是对象,得到的也可以是对象,所以它是全自动的。而Mybatis在查询时,需要手动编写sql来完成,操作的可以是对象,得到的也可以是对象,所以,称之为半自动ORM映射工具。
35.使用MyBatis的mapper形式开发有哪些要求?
-
①Mapper接口方法名和mapper.xml中定义的每个sql的id相同
-
②Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterTyep的类型相同
-
③Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
-
④Mapper.xml文件中的namespace即是mapper接口的类路径。
36.MySQL中Mybatis如何获取自增型主键值?
<insert id="insert" parameterType="cn.***.beans.LogObject" >
<selectKey resultType="java.lang.Integer" order="BEFORE" keyProperty="id">
SELECT LAST_INSERT_ID()
</selectKey>
insert into user(userName,password,comment)
values(#{userName},#{password},#{comment})
</insert>
37.#{}和${}的区别是什么?
-
#{}底层原理是预编译语句,可以防止sql注入,安全性高
-
${}底层原理就是简单的字符串拼接
-
#{}会自动对字符串参数添加单引号对,${}不会
38.当实体类中的属性名和表中的字段名不一样,怎么办?
第1种:通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致
第2种:通过<resultMap>来映射字段名和实体类属性名的一一对应的关系