栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring系列框架

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring系列框架

SSM框架 第一部分:Spring 1.简述什么是Spring框架
1. Spring框架的概述
    * Spring是一个开源框架
    * Spring是于2003 年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。
    * 它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。
    * Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以   从Spring中受益。
    * Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。
    * EE开发分成三层结构
        * WEB层      -- Spring MVC
        * 业务层   -- Bean管理:(IOC)
        * 持久层   -- Spring的JDBC模板.ORM模板用于整合其他的持久层框架

2.什么是IOC和AOP
IOC:控制反转
    将对象的创建权交给Spring去管理,我们需要使用某个对象时,直接从Spring框架获取即可使用.使用IOC可以解决的程序耦合性高的问题!
•AOP:面向切面编程
    用于实现关注点代码和业务代码的分离解耦的,可以提高代码的可维护性和可扩展性
    AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面
    AOP的作用:在程序运行期间,不修改源码对已有方法进行增强
​

3.Spring中bean的作用域
- 作用域是Bean的属性,可以单独对某个Bean的作用域进行修改
​
- Spring容器配置Bean对象的时候,默认所有的Bean对象都是单例的.
    
- Spring容器中Bean的常见作用域:
  singleton   --单例       Spring容器默认的
      
  prototype  --原型       Spring容器中,每次获取Bean对象,都会重新实例化
      
  request    --每个request对象代表一次请求,每发起一次请求,都会实例化用到的Bean对象
      
  session      --每次创建一个新的session对象,都会重新实例化用到的Bean对象
4.Spring框架中的Bean是线程安全的么?

Spring中的Bean是否线程安全,其实跟Spring容器本身无关。Spring框架中没有提供线程安全的策略,因此,Spring容器中在的Bean本身也不具备线程安全的特性。在多线程操作中如果需要对Bean中的成员变量进行数据更新操作,这样的Bean称之为有状态Bean,只有有状态的单例Bean才会存在线程安全问题。

如何处理Spring Bean的线程安全问题?

1、将Bean的作用域由 “singleton” 单例 改为 “prototype” 多例。 2、在Bean对象中避免定义可变的成员变量,当然,这样做不太现实,就当我没说。 3、在类中定义 ThreadLocal 的成员变量,并将需要的可变成员变量保存在 ThreadLocal 中,ThreadLocal 本身就具备线程隔离的特性,这就相当于为每个线程提供了一个独立的变量副本,每个线程只需要操作自己的线程副本变量,从而解决线程安全问题。

5.@Autowired和@Resource的区别
区别:
    1、@Autowired注解由Spring提供,只按照byType注入;
       @resource注解由J2EE提供,默认按照byName自动注入。
    2、@Autowired默认按类型进行装配,@Resource默认按照名称进行装配。

6.Spring中bean的生命周期
Bean的生命周期主要包含四个阶段:
    实例化Bean-->Bean属性填充-->初始化Bean-->销毁Bean
    
7.Spring的事务传播机制
比如代码中A方法调用了B方法,A方法、B方法上都标注了@Transactional,那么问题来了:A方法里对发给Mysql的sql语句应该和B方法里的在一个事务里吗?也就是说是在A方法、B方法执行之前都发begin transaction,执行之后都发commit,还是说只需要在A方法执行之前发begin transaction,在A方法执行之后发rollback呢?好,如何处理这样的问题,这就是Spring的事务传播机制。
    当出现多个事务嵌套的场景发生时,Spring事务的处理会变得复杂一些,需要考虑嵌套事务下的提交顺序,以及回滚顺序。对此,Spring提供了多种的传播机制,每种传播机制的效果都不尽相同,以便应对各种复杂的业务场景。
    正常处理的嵌套事务流程如下:
    主事务开启-->主事务执行-->子事务开启-->子事务执行-->子事务提交或回滚-->主事务提交或回滚
    传播机制以及它们的效果如下七种:
​
REQUIRED:默认值,支持当前事务,如果没有事务会创建一个新的事务
​
SUPPORTS:支持当前事务,如果没有事务的话以非事务方式执行
​
MANDATORY:支持当前事务,如果没有事务抛出异常
​
REQUIRES_NEW:创建一个新的事务并挂起当前事务
​
NOT_SUPPORTED:以非事务方式执行,如果当前存在事务则将当前事务挂起
​
NEVER:以非事务方式进行,如果存在事务则抛出异常
​
NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与REQUIRED类似的操作
​
8.Spring中的事务隔离级别
当两个事务对同一个数据库的记录进行操作时,那么,他们之间的影响是怎么样的呢?这就出现了事务隔离级别的概念。数据库的隔离性与并发控制有很大关系。数据库的隔离级别是数据库的事务特性ACID的一部分,ACID,即原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。
​
Spring的事务隔离级别有四个:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE,还有一个,是数据库默认的隔离级别DEFAULT,MySQL默认是REPEATABLE_READ。
​
READ_UNCOMMITTED:一个事务可以读取到另一个事务未提交的事务记录。
READ_COMMITTED:一个事务只能读取到已经提交的记录,不能读取到未提交的记录。
REPEATABLE_READ意思是,一个事务可以多次从数据库读取某条记录,而且多次读取的那条记录都是一致的,相同的。这个隔离级别可以避免dirty read和non-repeatable read的问题,但可能发生phantom read的问题.
SERIALIZABLE是Spring最强的隔离级别。事务执行时,会在所有级别上加锁,比如read和write时都会加锁,仿佛事务是以串行的方式进行的,而不是一起发生的。这会防止dirty read、non-repeatable read和phantom read的出现,但是,会带来性能的下降。

第二部分:SpringMVC 1.什么是MVC,以及简述Springmvc。
    MVC:
是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式,同时提供了对 HTML、CSS 和 JavaScript 的完全控制。
● Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常负责在数据库中存取数据。
● View(视图)是应用程序中处理数据显示的部分。通常是依据模型数据创建的。
● Controller(控制器)是应用程序中处理用户交互的部分。通常负责从视图读取数据,控制用户输入,并向模型发送数据。
    SpringMVC:
SpringMVC是一种基于Java实现的MVC设计模型的请求驱动类型的轻量级web框架,属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring框架提供了构建Web应用程序的全功能MVC模块,可以选择使用Spring中的SpringMVC框架或者集成其他MVC开发框架,如Struts等等。它通过一套注解,让一个简单的Java类成为处理请求的控制器,从而无需实现任何接口。
2.SpringMVC的执行流程?
 1、用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
 2、DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;(查找handler);
  3、 DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller), Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象(执行handler);
  4、DispatcherServlet 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver) (选择ViewResolver);
  5、通过ViewResolver 结合Model和View,来渲染视图,DispatcherServlet 将渲染结果返回给客户端。(渲染返回)
3.什么是重定向和转发,在SpringMVC如何实现重定向和转发?
    转发:
一种在服务器内部的资源跳转方式。
    1.通过request对象获取请求转发器对象:RequestDispatcher,getRequestDispatcher (String path)
    2.然后使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
    重定向:
 另一种资源跳转的方式。地址栏发生变化.重定向可以访问其他站点(服务器)的资源
重定向是两次请求。不能使用request对象来共享数据
    1.设置状态码为302
    2.设置响应头
   
4.@RestController和 @Controller区别是什么?
    区别:
1. @RestController相当于@Controller和@ResponseBody合在一起的作用;
2. 如果使用@RestController注解Controller层的话,则返回的是return里面的内容,无法返回到指定的页面,配置的视图解析器InternalResourceViewResolver也就自然没有作用了;
3. 如果要返回到指定的页面,则需要用@Controller配合视图解析器InternalResourceViewResolver;
4. 如果需要返回JSON、XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。 
5.SpringMVC中拦截器如何实现?

1.新建一个Moudule,配置好。 2.编写拦截器

public class MyInterceptor implements HandlerInterceptor {
 
   //在请求处理的方法之前执行,如果返回true执行下一个拦截器,如果返回false就不执行下一个拦截器
   public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { 
       return true;//或者false
  }
 
   //在请求处理方法执行之后执行
   public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
 
  }
 
   //在dispatcherServlet处理后执行,做清理工作.
   public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
 
  }
}

3.在springmvc的配置文件中配置拦截器


   
       //拦截/路径下所有
       //bean配置的就是拦截器 
       
   

4.接受请求的Controller

//测试拦截器的控制器
@Controller
public class InterceptorController {
   @RequestMapping("/interceptor")
   @ResponseBody
   public String testFunction() {
    //控制器中的方法执行了
       return "hello";
  }
}
6.拦截器和过滤器的区别?
    区别:
    1.实现原理不同
过滤器和拦截器 底层实现方式大不相同,过滤器 是基于函数回调的,拦截器 则是基于Java的反射机制(动态代理)实现的。
    2.使用范围不同
我们看到过滤器 实现的是 javax.servlet.Filter 接口,而这个接口是在Servlet规范中定义的,也就是说过滤器Filter 的使用要依赖于Tomcat等容器,导致它只能在web程序中使用。
而拦截器(Interceptor) 它是一个Spring组件,并由Spring容器管理,并不依赖Tomcat等容器,是可以单独使用的。不仅能应用在web程序中,也可以用于Application、Swing等程序中。
    3.触发时机不同
过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后。
拦截器 Interceptor 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束。
    4.拦截的请求范围不同
过滤器Filter执行了两次,拦截器Interceptor只执行了一次。这是因为过滤器几乎可以对所有进入容器的请求起作用,而拦截器只会对Controller中请求或访问static目录下的资源请求起作用。
    5.注入Bean情况不同
这是因为加载顺序导致的问题,拦截器加载的时间点在springcontext之前,而Bean又是由spring进行管理。
    6.控制执行顺序不同
过滤器用@Order注解控制执行顺序,通过@Order控制过滤器的级别,值越小级别越高越先执行。
拦截器默认的执行顺序,就是它的注册顺序,也可以通过Order手动设置控制,值越小越先执行
7.什么是RESTFUL?
RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。
第三部分:MyBatis 1.什么是MyBatis?
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
​
mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
​
mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。
​
2. #{} 和 ${} 的区别?
1、#{}是预编译处理,${}是字符串替换。
​
2、Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值;
​
3、Mybatis 在处理${}时,就是把${}替换成变量的值。
​
4、使用#{}可以有效的防止 SQL 注入,提高系统安全性。
3.简述MyBatis一级和二级缓存?
    MyBatis一级缓存:
在一个SqlSession对象中创建一个本地缓存(local cache),对于同一个SqlSession 每一次查询,都会尝试根据查询的条件去本地缓存中查找是否在缓存中,如果在,就直接从缓存中取出,然后返回给用户,一级缓存默认开启;否则,从数据库读取数据,将查询结果存入缓存并返回给用户。
    二级缓存:
称为全局缓存或者SqlSessionFactory级别,需要手动开启,可以实现跨SqlSession 的缓存,也可以针对某个命名空间开启。
    Mybatis的二级缓存是指mapper映射文件。二级缓存的作用域是同一个nameSpace下的mapper映射文件内容,多个SqlSession共享。Mybatis需要手动设置启动二级缓存。
一个会话,查询一条数据,这个数据会被放在当前会话的一级缓存中;如果会话被关闭了,一级缓存汇总的数据会被保存到二级缓存。新的会话查询信息就会参照二级缓存。
4.如何获取自增的主键?
1.通过JDBC2.0提供的insertRow()方式
2.通过JDBC3.0提供的getGeneratedKeys()方式
3.通过SQL select LAST_INSERT_ID()函数
4.通过SQL @@IDENTITY 变量
5. resultType 和 resultMap的区别?
ResultMap和ResultType的区别:
   1.使用ResultType,对于SQL语句查询出的字段在相应的pojo中必须有和它相同的字段对应;
   2.使用resultMap,需要在mapper.xml中定义pojo和相应表字段的对应。
6.当实体类属性名和表中字段名不一致时如何处理?
1.通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。
2. 通过来映射字段名和实体类属性名的一一对应的关系。
7.接口中传递多个参数时如何处理?
    1.最简单的方式,就按照错误提示给出的解决方案。即直接修改映射文件,将接收过来的参数以【arg0、arg1】来接收。
    2.同样采用最简单的方式,即直接修改映射文件,将接收过来的参数以【param1、param2】来接收。
    3.需要@Param注解,通过此注解给Mapper接口中方法的参数指定名称,那么也就意味着该注解是定义在方法参数的声明上。
此种方式又被称为命名参数,表示的是明确指定封装参数时map的key,语法是:@Param(参数名)
多个参数会被封装成一个map。key:使用@Param注解指定的值;value:参数值
#{key}获取key所对应的参数值

会话管理

  • ·客户端和服务器之间进行数据传输遵循的是HTTP协议,此协议属于无状态协议(一次请求对应一次响应,响应完之后链接就会断开)服务器是无法跟踪客户端的请求.通过Cookie服务器可以给客户端添加一个标识.当客户端再次发出请求时会带着这个Cookie这样服务器就能识别此客户端了.但是由于Cookie是保存在客户端的存在被篡改的风险,Session的出现解决了此问题

  • ·Cookie:打孔式会员卡,数据保存在客户端
    • 只能保存字符串数据

    • 默认数据是保存在浏览器内存中,当回话结束(浏览器关闭)数据会删除,也可以设置自定义的保存时长,设置完之后的数据会保存在磁盘中时间到了后清除.

    • 应用场景:需要长时间保存的数据,比如:记住用户名和密码
  • Session:相当于银行卡,数据保存在服务器内存中(工程重新启动会清空所有Session)
    • 可以保存任意对象类型的数据
    • 默认数据只能保存半小时左右,而且不建议修改保存时长,因为数据是保存在服务器的内存中的,服务器只有一个所以不能占用太多的内存.
    • 应用场景:保存登录状态,涉及敏感数据,因为数据保存在服务器会更安全

如何通过Session对象记住登录状态

  1. 在登录成功时把当前客户端登录的user用户对象保存到当前客户端所对应的Session对象里面,
  2. 每个客户端进入到首页index.html时会立即发请求获取当前客户端登录的用户对象,服务器接收到请求后会从当前客户端所对应的Session对象里面获取曾经保存过的用户对象(前提是登陆过),如果没有登录直接获取得到的是null返回给客户端,此时客户端得到的是""空字符串,客户端判断是否是空字串来表示是否登录过,通过给isLogin赋值true或false来控制页面显示的内容
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/995849.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号