暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

面试题之Spring、SpringMVC

代码钢琴家 2021-05-02
203

一 Spring

1.1概念

   Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求.

1.2 组成:有七个模块

Spring Core:核心类库,提供IOC服务;
Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI命名与目录接口规范、定时任务等);
Spring AOP:AOP服务 面向切面编程;
Spring DAO:对JDBC的抽象,简化了数据访问异常的处理;
Spring ORM:对现有的ORM框架的支持;
Spring Web:提供了基本的面向Web的综合特性,例如文件上传;
Spring MVC:提供面向Web应用的Model-View-Controller实现。

1.3 优点

1.spring属于低侵入式设计,代码的污染极低;
2.spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性;
3.Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,实现业务复用。
4.spring对于主流的应用框架提供了集成支持。
5.spring简化异常处理:Spring 提供方便的 API 把具体技术相关的异常转化为一致的 unchecked异常。

1.4 IOC/DI的理解

IOC:  Inversion of Control 控制反转,是指对象创建和操作的控制权的转移给spring容器
     以前创建和使用对象的主动权有程序决定,而现在这种权力转移到Spring容器中,并由容器根据配置文件去创
     建实例和分配实例之间的关系,对象与对象之间松散耦合,易于复用。
DI:  Dependency Injection依赖注入,应用程序在运行时通过spring容器把依赖的实例动态注入到项目中。
     和控制反转是同一个概念的不同角度的描述
三种注入方式:Spring的IOC有三种注入方式 :构造器注入、setter方法注入、根据注解注入。

1.5 AOP

AOP:Aspect Oriented Programming面向切面,对面向对象的一种补充
   通过预编译方式在运行时由动态代理实现程序功能的统一维护的一种技术
   用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect)。
   减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。
   可用于权限认证、日志、事务处理等
AOP实现的关键在于代理模式
    静态代理:代理对象和目标对象实现相同接口 代理对象对关联的目标对象方法进行扩展
            缺点局限性差 只能对指定类型的对象扩展
    动态代理:实现InvocationHandler接口 实现invoke方法
            缺点只能对指定接口类型的实现类扩展
    cglib代理:实现MethodInterceptor接口 实现intercept方法
            可以代理所有对象
   IoC让相互协作的组件保持松散的耦合,
  AOP编程允许你把遍布于应用各层的功能分离出来形成可重用的功能组件。

1.6 Spring Bean生命周期

(1)实例化Bean:
  对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,会调用createBean进行实例化。
  对于ApplicationContext容器,当容器启动后,通过获取BeanDefinition对象中的信息,实例化所有         的bean。
(2)设置对象属性(依赖注入):
      实例化后的对象被封装在BeanWrapper对象中,Spring根据BeanDefinition中的信息以及通过              BeanWrapper提供的设置属性的接口完成依赖注入。
(3)处理Aware接口:
      Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给Bean:
      ①如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)
      法,此处传递的就是Spring配置文件中Bean的id值;
      ②如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,传递的        是Spring工厂自身。
      ③如果这个Bean已经实现了ApplicationContextAware接口,会调用                     setApplicationContext(ApplicationContext)方法,传入Spring上下文;
(4)BeanPostProcessor:
     如果想对Bean进行一些自定义的处理,那么可以让Bean实现了BeanPostProcessor接口,那将会调用
     postProcessBeforeInitialization(Object obj, String s)方法。
(5)InitializingBean init -method:
     如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。
(6)如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object       obj, String s)方法;由于这个方法是在Bean初始化结束时调用的,所以可以被应用于内存或缓存技术;
     以上几个步骤完成后,Bean就已经被正确创建了,之后就可以使用这个Bean了。
(7)DisposableBean:
     当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,
     会调用其实现的destroy()方法;
(8)destroy-method:
     最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

1.7、自动装配有哪些方式?

自动装配:通过autowire配置由spring容器实现对象的自动关联
1)no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean。
2)byName - 它根据 bean 的名称注入对象依赖项
3)byType - 它根据 bean 的类型注入对象依赖项
4)constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配
5)autodetect - 首先容器尝试通过构造函数使用 autowire 装配,如果不能,则尝试通过 byType 自动装配。

1.8、如何在 spring 中启动注解装配?

<context:annotation-config/>

1.9、@Component, @Controller, @Repository,@Service 有何区别?

四个注解都用于spring容器创建bean对象
@Component 适用于任意层
@Controller :使用与springmvc的控制层
@Service   使用于业务层
@Repository :使用于持久层:使未经检查的异常有资格转换为 Spring DataAccessException。

1.10、spring bean的作用域

(1)singleton:默认,每个容器中只有一个bean的实例,单例的模式由BeanFactory自身来维护。
(2)prototype:每次对bean请求都提供一个新的实例。
(3)request:为每一个网络请求创建一个实例,在请求完成以后,bean失效
(4)session:为每个session回话创建一个实例,在session过期后,bean会随之失效。
(5)global-session:全局作用域,一个项目只存在一个实例

1.11、spring中涉及到那些设计模式

(1)工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
(2)单例模式:Bean默认为单例模式。
(3)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
(4)模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
(5)观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现--ApplicationListener。

1.12 、spring事务

Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。
    真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。
Spring事务的种类:
    spring支持编程式事务管理和声明式事务管理两种方式:
   ①编程式事务管理使用TransactionTemplate。  可以作用到代码块级别
   ②声明式事务管理建立在AOP之上 通过@Transactional注解实现。 只能作用到方法级别 非侵入式开发

1.13、spring的事务传播行为

spring事务的传播行为说的是,当多个事务同时存在的时候,spring如何处理这些事务的行为。
    PROPAGATION_REQUIRED(常用):如果当前没事务,就创建一个新事务,如果当前有事务,就加入该事务
    PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以       非事务执行。
    PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛       出异常。
    PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
    PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
    PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性       执行。

1.14、spring的事务隔离级别

     ISOLATION_DEFAULT(默认):使用数据库默认的事务隔离级别。
    ISOLATION_READ_UNCOMMITTED:读未提交,允许另外一个事务可以看到这个事务未提交的数据。
    ISOLATION_READ_COMMITTED:读已提交,保证一个事务修改的数据提交后才能被另一事务读取,而且能看
     到该事务对已有记录的更新。
    ISOLATION_REPEATABLE_READ:可重复读,保证一个事务修改的数据提交后才能被另一事务读取,但是不
     能看到该事务对已有记录的更新。
    ISOLATION_SERIALIZABLE:一个事务在执行的过程中完全看不到其他事务对数据库所做的更新。

二:springmvc

2.1 概念

springmvc:spring框架提供的构建web应用程序的全功能mvc模块
springmvc遵循mvc设计模式的思想 把视图渲染、请求处理、模型创建    

简化的处理过程:

详细的处理过程:

SpringMVC的请求相应步骤如下
1、用户向服务器发送请求,请求被Spring中央控制器Servelt DispatcherServlet捕获
2、DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用
 HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),
 最后以HandlerExecutionChain对象的形式返回
3、DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。
4、提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)
5、Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象。
6、根据返回的ModelAndView,选择一个适合的ViewResolver返回给DispatcherServlet
7、ViewResolver 结合Model和View,来渲染视图
8、将渲染结果返回给客户端

2.2 springmvc四大组件

1)DispatcherServlet:中央控制器:接受请求 、统一调度
      降低组件之间的耦合度 托管组件的扩展性
2)HandleMappering:处理器映射器
     指定url和action的映射关系:可以是配置方式、注解方式
3)HandleAdapter:处理器适配器
     根据映射器找到的处理器 Handler 信息,按照特定的规则去执行相关的处理器 Handler。
4)ViewResolver:视图解析器
     把视图逻辑路径 解析为视图真实路径

2.3 springmvc的优点

1.清晰的角色划分:控制器(controller)、验证器(validator)、命令对象(command obect)、表单对象(form   object)、模型对象(model object)、Servlet分发器(DispatcherServlet)、处理器映射(handler       mapping)、试图解析器(view resoler)等等。每一个角色都可以由一个专门的对象来实现。
2.强大而直接的配置方式:将框架类和应用程序类都能作为JavaBean配置,支持跨多个context的引用,例如,在   web控制器中对业务对象和验证器validator)的引用。
3.可适配、非侵入:可以根据不同的应用场景,选择何事的控制器子类(simple型、command型、from型、wizard   型、multi-action型或者自定义),而不是一个单一控制器(比如Action/ActionForm)继承。
4.可重用的业务代码:可以使用现有的业务对象作为命令或表单对象,而不需要去扩展某个特定框架的基类。

2.4 mvc

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改变页面时,不需要重新编写业务逻辑。
   Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。
   View(视图) - 视图代表模型包含的数据的可视化。
   Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。
                        它使视图与模型分离开

2.5 注解

概念:
   注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类。
   通过反射获取注解时,返回的是Java运行时生成的动态代理对象。
   通过代理对象调用自定义注解的方法,会最终调用AnnotationInvocationHandler的invoke方法。
常见:
   @Override - 检查该方法是否是重写方法。
   @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
   @SuppressWarnings - 指示编译器去忽略注解中声明的警告。
   @Test - 单元测试
springmvc常用的注解
   1. @RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。
   2. @RequestBody:将HTTP请求正文转换为适合的HttpMessageConverter对象
   3. @ResponseBody:将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入响应体中。
   4. @Controller 标记一个类是作为控制层
   5. @Service 标记一个类是作为业务层
   6. @repository: 标记一个类是作为持久层
   7. @RequestParam: 绑定单个请求参数
   8@PathVariable绑定URI模板变量值
   9. @Autowired@Resource:自动装配(实现对象)
        @Autowired按类型装配:@Resource先按名字 再按类型            

2.6 Spring MVC怎么实现重定向和转发

(1)转发:在返回值前面加"forward:",譬如"forward:user.do?name=method4"
(2)重定向:在返回值前面加"redirect:",譬如"redirect:http://www.baidu.com"

2.7 拦截器和过滤器的区别

相同之处: 基本功能相似 ,都可以对指定的请求进行拦截 进行预处理、权限管理、日志记录等操作 
        都是aop编程思想的体现
不同之处:1  实现接口不同
                过滤器Filter实现接口:Filter接口
                拦截器Interceptor实现接口:HanderInteceptor接口
       2 是否依赖web容器
                Filter是servlet规范 需要web应用服务器解析
                Interceptor由spring容器支持  不依赖web容器
       3  实现原理不同
                Filter是函数回调
                Interceptor是反射和动态代理
       4  适用的项目不同
                Filter只使用于web项目
                Interceptor使用于所有项目中
       5  拦截资源不同
                Filter可以拦截对所有资源的请求
                Interceptor只能拦截action(方法)

2.8 action方法的参数类型和返回值类型

参数类型:
   1 参数是单值:接受同名的请求参数
   2参数是javabean对象:通过对象的属性来接受同名的请求参数
   3 参数是HttpServletRequest:请求对象
   4 参数是HttpServletResponse:响应对象
   5 参数是HttpSession:回话
   6 参数是model:request域对象
返回值类型:
   1 返回值类型是String::返回的是跳转资源的路径
2 返回值类型是ModelAndView::设置跳转资源的路径+request域属性
3 返回值类型是void




文章转载自代码钢琴家,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论