面试 - Spring

原创
2020/02/24 16:47
阅读数 499

SpringMVC执行流程及原理?
用户发起请求到前端控制器(DispatcherServlet),该控制器会过滤出哪些请求可以访问Servlet、哪些不能访问。就是url-pattern的作用,并且会加载SpringMVC.xml配置文件。
前端控制器会找到处理器映射器(HandlerMapping),通过HandlerMapping完成url到controller映射的组件,简单来说,就是将在SpringMVC.xml中配置的或者注解的url与对应的处理类找到并进行存储,用Map这样的方式来存储。
HandlerMapping有了映射关系,并且找到url对应的处理器,HandlerMapping就会将其处理器(Handler)返回,在返回前,会加上很多拦截器。
DispatcherServlet拿到Handler后,找到HandlerAdapter(处理器适配器),通过它来访问处理器,并执行处理器。
执行处理器会返回一个ModelAndView对象给HandlerAdapter。
通过HandlerAdapter将ModelAndView对象返回给前端控制器(DispatcherServlet)。
前端控制器请求视图解析器(ViewResolver)去进行视图解析,根据逻辑视图名解析成真正的视图(jsp),其实就是将ModelAndView对象中存放视图的名称进行查找,找到对应的页面形成视图对象,返回视图对象到前端控制器。
视图渲染,就是将ModelAndView对象中的数据放到request域中,用来让页面加载数据的。

依赖注入是什么?
依赖注入(DependencyInjection)和控制反转(InversionofControl)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。

用静态方法写测试用例时如何获取服务的实例
继承AbstractJUnit4SpringContextTests。
引入ApplicationContext。

Bean注入后执行初始化代码的途径
可以在XML配置bean时,指定init-method属性即可。
需要在需要执行的方法上添加@PostConstruct注解即可。

AOP的原理
切面:拦截器类,其中会定义切点以及通知。
切点:具体拦截的某个业务点。
通知:切面当中的方法,声明通知方法在目标业务层的执行位置,通知类型如下:
    前置通知:@Before 在目标业务方法执行之前执行
    后置通知:@After 在目标业务方法执行之后执行
    返回通知:@AfterReturning 在目标业务方法返回结果之后执行
    异常通知:@AfterThrowing 在目标业务方法抛出异常之后
    环绕通知:@Around 功能强大,可代替以上四种通知,还可以控制目标业务方法是否执行以及何时执行

拦截器和过滤器的区别
过滤器(Filter):
依赖于servlet容器。
在实现上,基于函数回调,它可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的,是用来做一些过滤操作,获取我们想要获取的数据,比如:在Javaweb中,对传入的request、response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者Controller进行业务逻辑操作。通常用的场景是:在过滤器中修改字符编码(CharacterEncodingFilter)、在过滤器中修改HttpServletRequest的一些参数(XSSFilter(自定义过滤器)),如:过滤低俗文字、危险字符等。

拦截器(Interceptor):
依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。
在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在service或者一个方法前,调用一个方法,或者在方法后,调用一个方法,比如动态代理就是拦截器的简单实现,在调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在调用方法后打印出字符串,甚至在抛出异常的时候做业务逻辑的操作。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。

拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调。从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。
Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor。不过还是根据不同情况选择合适的。

Spring IOC和AOP的原理?
控制反转(IOC)与依赖注入(DI)是同一个概念,目的在于降低系统偶尔,将类的实例化工作转交给Spring代理,主要用到的设计模式为工厂模式,通过Java反射机制实现类的自动注入。
AOP意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

SpringBoot是什么?
用来简化Spring应用的初始搭建以及开发过程,使用特定的方式来进行配置(properties或yml文件)
创建独立的Spring引用程序main方法运行。
嵌入的Tomcat无需部署war文件。
简化Maven配置。
自动配置Spring添加对应功能Starter自动化配置。

SpringBoot常用的Starter有哪些?
spring-boot-starter-web:tomcat和web开发需要servlet与jsp支持。
spring-boot-starter-data-jpa:数据库支持。
spring-boot-starter-data-redis:redis数据库支持。
spring-boot-starter-data-solr:solr支持。
mybatis-spring-boot-starter:第三方的MyBatis集成Starter。

SpringBoot自动配置的原理?
在Spring程序main方法中添加@SpringBootApplication或者@EnableAutoConfiguration会自动去Maven中读取每个Starter中的spring.factories文件该文件里配置了所有需要被创建Spring容器中的bean。

SpringBoot读取配置文件的方式?
SpringBoot默认读取配置文件为application.properties或者是application.yml。

SpringBoot集成MyBatis的过程?
添加MyBatis的依赖:

<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>`
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部