面试真题1

1.描述servlet的生命周期中涉及到哪些方法

servlet默认是单例的
	1.当请求第一次到达时,对应的servlet进行实例化
	2.实例化后立即调用init方法进行初始化
	3.之后,每次请求到达,都会调用service方法进行处理请求
	4.当web应用程序即将结束时,将servlet销毁,调用destroy方法

servlet的实例化时机:
	1.默认情况下,是在请求第一次到达时进行实例化
	2.还可以在web程序启动时将servlet进行实例化,需要配置
		@WebServlet(loadonstartup=true)
		UserServlet

UserServlet{
	构造方法
	init(){}
	service()
	doGet()
	doPost()
	destroy()
}

2.转发(forward)和重定向(redirect)的区别

1. 转发是由服务器端完成的,而重定向是由客户端完成的
2. 转发客户端发起的是一次请求,重定向客户端发起的是两次请求
3. 转发操作地址栏的地址不会发生改变;重定向地址栏的地址会发生改变
4. 转发可以实现数据的共享;重定向不能数据共享
5. 转发只能向本应用内的资源发起请求;重定向可以向本应用外的资源发起请求

3. 乐观锁和悲观锁

乐观锁和悲观锁是2种思想
    
乐观锁不是使用锁来保证线程安全的,而是使用版本号机制来保证线程安全
悲观锁是真正使用锁来保证线程安全的,特点保证线程安全的同时并发执行效率低.应用:排它锁   Java的synchronized

4.mybatis中${}与#{}的区别

#{}实现类预编译  ${}没有实现预编译,通常用于做字符串拼接

5.拦截器(Interceptor)和过滤器(Filter)的区别

相同之处:
	1. 作用相似,都是对请求进行拦截过滤
    2. 都可以形成链状结构,在链中的顺序取决于配置顺序
1. 所属框架不同:
	过滤器是JAVAEE提供的,拦截器是Spring提供的
2. 作用时机不同:
	过滤器是在请求到底servlet之前进行过滤
    拦截器是在servlet之后,controller之前对请求进行拦截过滤的
3. 内部的方法数量不同
     过滤器(Filter) 内部只有一个抽象方法  doFilter()
     在该方法内部写过滤功能的代码实现
     拦截器(Interceptor)内存有2个抽象方法
        preHandle():最常用的,当请求在servlet之后,到底controller之前调用该方法
        postHandle():DiapatcherServlet渲染视图之前执行
        afterCompletion():在请求即将结束时调用该方法,通常用于释放资源
4. 配置方式不同
        过滤器只能配置黑名单;
		拦截器既可以配置黑名单也可以配置白名单

6.请描述springmvc的五大组件并描述springmvc对请求的处理流程

DispatcherServlet//前端/中央处理器
HandlerMapping//映射处理器
Controller//控制器
ModelAndView//视图数据模型
ViewResolver//视图解析器
    
1. 请求先到达DispatcherServlet
2. DispatcherServlet调用HandlerMapping来对请求进行解析,可以找到对应的cotroller以及方法
3. 到达对应的controller中对应的方法,对请求进行处理
4. controller处理请求结束,返回ModelAndView给DispathcerServlet
5. DispatcherServlet调用ViewResolver来对视图进行解析
6. DispatcherServlet进行视图的渲染

7.说说自动装配注解Resource和注解Autowired的区别

1. 所属框架不同
    @Resource  是由java提供的
	@AutoWired 是Spring提供的
2. 注入方式不同:
	@Resource默认是先按照bean的name(名称)进行注入,若name不存在,
      则自动按照type进行注入,若通过该注解指定了name,则若找不到name,注入失败
    @AutoWited注解按照type(类型)来注入

8.Spring中Bean的作用域

通过属性scope来设置bean的作用域:
属性值:
   singleton - 默认  单例
   prototype - 原型  每次注入都会重新实例化
   request - 每次请求中,若需要某个bean对象,每次请求都会重新实例化
   session - bean的作用域为session,即新创建session对象,
             会重新实例化,session对象销毁,该bean对象销毁
   global session  - 在portlet容器中存在的对象,
   该对象作用于整个应用程序,bean作用于整个global session对象中.
   每次新建该对象,都会重新实例化bean,在web应用中不存在该对象

9.请描述mybatis中的一级和二级缓存

前提了解:
1. 数据库中若执行单个增删改操作,会自动为其开始事务;若在service层为某个方法开始了事务管理,
(通过Spring的声明式事务管理),则数据库中不再为操作开启事务,
因为业务层的事务管理就是数据库中的事务管理.
2. 持久层访问数据库时,每次访问均需要sqlsession对象,有了该对象才能访问数据库.
而sqlSession对象是由mybatis中的sqlsessionFactory来提供的,
这里使用了工厂模式,每次访问数据库时,都会从该工厂中获取一个sqlsession对象
3. 注意:同一个事务中共享一个sqlsession对象

mybatis的一级缓存是sqlsession级别的缓存,同一个事务中共享一个sqlsessioin对象.
在事务中若执行查询操作,会将查询到的数据缓存到一级缓存中,
后续若再次查询相同的数据,直接从缓存获取即可(查询操作的顺序:先去一级缓存查,
若有,直接返回,若无,再去数据库中查).
但是注意:若事务中在查询后执行了update操作,此时清空一级缓存

一级缓存的意义:提高查询效率(对数据库IO操作ms级别;对内存IO操作ns级别)
二级缓存:是mapper/namespace级别的缓存,二级缓存默认关闭,若想使用,必须通过设置来开启.
二级缓存可以实现跨sqlsession数据的共享,但是若操作该mapper的多个sqlsession中,
有一个执行了update操作,则立即清空二级缓存
一级二级都存在时,事务中的查询顺序:二级缓存-->一级缓存-->数据库

如何开启二级缓存:
		1.mybatis的配置文件中添加属性: cachable:true
		2.在想开启二级缓存的mapper的xml文件中添加一组标签(添加为<mapper>的子标签),<cache></cache>或 <cache/>
			<mapper namespace="">
				<cache/>
			</mapper>

 10.mybatis的动态sql

1. if标签:
<select id="findActiveBlogLike" resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <if test="title != null">
    AND title like #{title}
  </if>
  <if test="author != null and author.name != null">
    AND author_name like #{author.name}
  </if>
</select>
      
2. choose...when..otherwise
<select id="findActiveBlogLike" resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <choose>
    <when test="title != null">
      AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
      AND author_name like #{author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>
</select>      
3. where标签:
<select id="findActiveBlogLike"  resultType="Blog">
  SELECT * FROM BLOG
  <where>
    <if test="state != null">
         state = #{state}
    </if>
    <if test="title != null">
        AND title like #{title}
    </if>
    <if test="author != null and author.name != null">
        AND author_name like #{author.name}
    </if>
  </where>
</select>
        
where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。
而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。
        
4. set标签:修改操作中修改的数据动态设置
<update id="updateAuthorIfNecessary">
  update Author
    <set>
      <if test="username != null">username=#{username},</if>
      <if test="password != null">password=#{password},</if>
      <if test="email != null">email=#{email},</if>
      <if test="bio != null">bio=#{bio}</if>
    </set>
  where id=#{id}
</update>
    
5. foreach标签:用于对集合,数组进行遍历
<select id="selectPostIn"resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  WHERE ID in
  <foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
        #{item}
  </foreach>
</select>
    
 各属性的意义:
	collection:遍历的对象类型
    item:给出引用,指向遍历得到的元素对象
    index:序号
    open:所有遍历到的元素最开始以..开头
    close:所有元素遍历结束,以...结尾
    separator:遍历到的元素之间的分隔符
 
    你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象
作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,
item 的值是本次迭代获取到的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,
index 是键,item 是值。 

11.请说出几个Spring中的注解以及其作用

组件类注解:
	@Controller
	@Service	
	@Repository -- 持久层组件
    @Component -- 通用组件
    @Configuration -- 配置组件
    @Bean
SprignMVC中的注解:
	@RestController =@Controller+@Responsebody
	@ResponseBody:将返回的数据封装到响应体中返回
    @RequestMapping  :定义请求映射路径
    @GetMapping: 只处理get请求
    @PostMapping :只处理post请求
    @RequestParam :对接收到的参数进行判断
        
组件扫描注解:@ComponentScan
@AutoWired   注入对象
@Transactional   开启事务管理
@SpringBootApplication  启动类注解

12.请简述Spring的两种核心技术

IOC: Inversion of Control  
    将对象的创建权交给spring去管理
    IOC和DI的区别:IOC描述的是现象;DI是过程
	DI:依赖注入        
AOP: aspect oriented  programming  面向切面编程
 
1. 什么是aop:
    aop是面向切面编程,其作用是用于实现业务代码和关注点代码的分离解耦,
    从而提高关注点代码的可维护性与可扩展性.

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙慧德

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值