https://github.com/doocs/advanced-java
[1]
ioc,aop原理
ioc初始化流程
springmvc的流程
springboot,spring cloud相关组件
http://blog.sina.com.cn/s/blog_18b0414be0102y586.html
[2] 史上最全70道Spring面试题!
1.什么是spring?
Spring是Java企业级应用的开源开发框架, Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。
Spring包括的模块主要有IOC、DI、AOP、JDBC、MVC等等
Spring Boot简化了繁琐的配置, 可用于快速开发微服务,也可用于微服务的一键启动和部署。
Spring Cloud建立在Spring Boot之上的一系列框架的集合, 集合了服务注册、服务发现、负载均衡、断路器、网关等功能组件, 可以方便的实现分布式系统微服务的开发。
什么是ApplicationContext
Spring里面最重要的两个核心接口是BeanFactory和ApplicationContext, BeanFacotry是最顶层的接口, ApplicationContext是BeanFactory的子接口,它代表了Spring容器。
Spring容器是创建Bean实例的工厂, 并且管理容器中的bean。
ApplicationContext和BeanFactory的区别:
a. BeanFactory(如XMLBeanFactory)是采用延迟实例bean方式, 也就是说调用getBean方法获取Bean时才会生成Bean实例并返回。
即使在配置bean时配置lazy-init=false也是这样。
ApplicationContext则相反,默认在容器启动时就会创建所有的bean, 配置了lazy-init=true的除外, 所以占用内存,启动比BeanFactory慢。
b. ApplicationContext的功能更完善, 如: 国际化支持、资源访问、通过实现ApplicationContextAware接口进行事件传递、AOP、事务管理等功能
c. BeanFacotory主要面对Spring框架的基础设施, 面对Spring自己; 而ApplicationContext面对Spring的开发者, 开发时基本都会使用ApplicationContext, 不用BeanFactory。
常用的ApplicationContext
AnnotationConfigApplicationContext: 根据Java配置类加载ApplicationContext
AnnotationConfigWebApplicationContext: 根据Java配置类加载的web ApplicationContext
ClassPathXmlApplicationContext: 指定classpath下的xml配置文件加载ApplicationContext
FileSystemXmlApplicationContext: 指定FileSystem路径下的xml配置文件加载ApplicationContext
2.使用Spring框架的好处是什么?
轻量:Spring 是轻量的,基本的版本大约2MB。
控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
容器:Spring 包含并管理应用中对象的生命周期和配置。
MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。
3.Spring由哪些模块组成?
https://blog.csdn.net/lj1314ailj/article/details/80118372
4.核心容器(应用上下文)模块。
这是基本的Spring模块,提供spring框架的基础功能,BeanFactory 是任何以spring为基础的应用的核心。Spring 框架建立在此模块之上,它使Spring成为一个容器。
5.BeanFactory实现举例。
BeanFactory是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从真正的应用代码中分离。
最常用的BeanFactory 实现是XmlBeanFactory 类。
6.XMLBeanFactory
最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory ,它根据XML文件中的定义加载beans。该容器从XML 文件读取配置元数据并用它去创建一个完全配置的系统或应用。
7.解释AOP模块
AOP概念、作用, AOP实现原理, 应用举例
AOP是面向切面编程
Aspect Oriented Programming, 是一种编程思想,
所谓"切面",就是使用"横切"技术, 将那些与业务无关,却为业务模块所共同调用的逻辑封装起来,实现非业务逻辑的封装。
作用:
AOP实现了软件系统的业务代码和非业务代码的分离, 降低了模块之间的耦合度,提高了代码可重用性, 提高了软件系统的扩展性、可维护性。
实现原理:
可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能。
应用举例:
权限认证、事务处理、日志记录、性能统计、缓存处理、异常处理。
8.解释JDBC抽象和DAO模块。
9.解释对象关系映射集成模块。
spring-orm 主要用于集成hibernate、JPA
10.解释WEB模块。
spring-web模块为Spring提供了最基础 Web支持,主要建立于核心容器之上,通过 Servlet 或者 Listeners 来初始化IOC容器,也包含一些与 Web 相关的支持。
11.为什么说Spring是一个容器?
12.Spring配置文件
13.什么是SpringIOC容器?
14.IOC的优点是什么?
实现组件之间的解耦,提高程序的灵活性和可维护性
缺点:
1、创建对象的步骤变复杂了,不直观,当然这是对不习惯这种方式的人来说的。
2、因为使用反射来创建对象,所以在效率上会有些损耗。但相对于程序的灵活性和可维护性来说,这点损耗是微不足道的。
15.ApplicationContext通常的实现是什么?
AnnotationConfigApplicationContext 从配置类中加载applicationContext
AnnotationConfigWebApplicationContext 从配置类中加载webApplicationContext
ClassPathXmlApplicationContext 从
FileSystemXmlApplicationContext
16.Bean工厂和Applicationcontext有什么区别?
a. BeanFactory(如XMLBeanFactory)是采用延迟实例bean方式, 也就是说调用getBean方法获取Bean时才会生成Bean实例并返回。
即使在配置bean时配置lazy-init=false也是这样。
ApplicationContext则相反,默认在容器启动时就会创建所有的bean, 配置了lazy-init=true的除外, 所以占用内存,启动比BeanFactory慢。
b. ApplicationContext的功能更完善, 如: 国际化支持、资源访问、通过实现ApplicationContextAware接口进行事件传递、AOP、事务管理等功能
c. BeanFacotory主要面对Spring框架的基础设施, 面对Spring自己; 而ApplicationContext面对Spring的开发者, 开发时基本都会使用ApplicationContext, 不用BeanFactory。
17.一个Spring的应用看起来象什么?
18.什么是Spring的依赖注入?
19.有哪些不同类型的IOC(依赖注入)方式?
接口注入
setter方法注入
构造器注入
20.哪种依赖注入方式你建议使用,构造器注入,还是Setter方法注入?
setter方法注入
注入方式:
通过构造器、通过setter方法、通过注解
推荐使用注解方式。
21.什么是Spring beans?
22.一个Spring Bean定义包含什么?
id class init-method detroy-method lazy-init等等
23.如何给Spring容器提供配置元数据?
xml或者注解配置或java配置
24.你怎样定义类的作用域? 怎么配置?
每个作用域适用场景及原因?
配置:
xml文件中, 配置bean元素的scope属性
注解类中, 配置@Scope注解
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
Servlet是单例的吗?
Servlet是否是单例是由Servlet版本规范和Servlet容器共同决定的。
一般情况下:
a. 如果是非分布式网络部署, 一般web.xml中声明的一个Servlet对应一个实例。
b. 如果Servlet实现了SingleThreadModel接口, 就会初始化多个Servlet实例, SingleThreaModel接口已经被遗弃了。
是否在分布式环境中部署
是否实现SingleThreadModel,如果实现则最多会创建20个实例
在web.xml中声明了几次,即使同一个Servlet,如果声明多次,也会生成多个实例。
所以通常情况下是单例的, 为什么呢? 如果不是单例而是原型的, 如果同时接受2000个并发请求,那么内存会立即生成2000个实例, 这对性能消耗非常大。
如果是单例,考虑到可能访问共享资源,就可能存在线程安全问题,但是这种情况应用场景非常少,且可以解决。
25.解释Spring支持的几种bean的作用域。
26.Spring框架中的单例bean是线程安全的吗?
没有关系
27.解释Spring框架中bean的生命周期。
01.Spring对bean进行实例化;
02.Spring将值和bean的引用注入到bean对应的属性中;
03.如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBean-Name()方法;
04.如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;
05.如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来;
06.如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法;
07.如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法。类似地,如果bean使用init-method声明了初始化方法,该方法也会被调用;
08.如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitialization()方法;
09.此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁。
10.如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。
28.哪些是重要的bean生命周期方法?你能重载它们吗?
29.什么是Spring的内部bean?
30.在Spring中如何注入一个java集合?
31.什么是bean装配?
创建对象的协作关系称为装配,也就是DI(依赖注入)的本质。而在Spring容器中对bean的创建后就需要对它所依赖的对象进行注入装配
1.Spring提供了三种装配bean的方式
在XML中进行显示配置;
在Java中进行显示配置;
隐式的bean发现机制和自动装配;
注:三种装配方式可以结合使用,但是推荐首选第3种自动装配,之后选用Java进行装配,最后选用XML进行装配。
32.什么是bean的自动装配?
33.解释不同方式的自动装配。
34.自动装配有哪些局限性?
基本数据类型、String类型无法实现自动装配
35.你可以在Spring中注入一个null和一个空字符串吗?
可以
36.什么是基于Java的Spring注解配置?给一些注解的例子.
通过Java配置的方式实现依赖注入, 无需XML文件
@Configuration和@Bean
37.什么是基于注解的容器配置?
XML配置的优点: 解耦了配置和代码, 而注解的配置则简化了代码。
二者各有各的优点。
Spring框架基于注解的容器配置
@Qualifier
@Autowired
@Resouce
@PostConstruct
@PreDestroy
1.@PostConstruct说明
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。
2.@PreDestroy说明
被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。
38.怎样开启注解装配?
在spring的配置文件中配置<context:annotation-config/> 元素
39.@Required注解
@Require注解作用域Bean的setter方法上, 表示setter方法对应的属性必须在xml配置文件中填充,否则会报:BeanInitializationException。
可用于依赖检查。
40.@Autowired注解
主动装配, 从Spring容器中找到对应的bean引用,并赋值给@Autowired注解的成员。
41.@Qualifier注解
和@Autowired联合使用,指定自动装配bean的名称。
42.在Spring框架中如何更有效地使用JDBC?
jdbcTemplate
43.JdbcTemplate
Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。
JdbcTemplate位于spring-jdbc模块中。
要使用JdbcTemlate还需依赖spring-tx事务控制模块。
JdbcTemplate主要提供以下4类方法:
execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
query方法及queryForXXX方法:用于执行查询相关语句;
update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
call方法:用于执行存储过程、函数相关语句。
44.Spring对DAO的支持
spring-jdbc和spring-tx
spring-orm
统一的数据访问模板,如JdbcTemplate、JpaTemplate
解决方案(模板设计模式,本质:将可变的和不可变的分离)
模板方法模式:定义操作的步骤(固定的),将可变的步骤交给子类处理。
统一的异常体系
Spring提供了一套抽象DAO类供你扩展。
JdbcDaoSupport - JDBC数据访问对象的基类。
需要一个DataSource,同时为子类提供 JdbcTemplate。
HibernateDaoSupport - Hibernate数据访问对象的基类。
需要一个SessionFactory,同时为子类提供 HibernateTemplate。
JdoDaoSupport - JDO数据访问对象的基类。
需要设置一个PersistenceManagerFactory, 同时为子类提供JdoTemplate。
JpaDaoSupport - JPA数据访问对象的基类。
需要一个EntityManagerFactory,同时 为子类提供JpaTemplate。
45.使用Spring通过什么方式访问Hibernate?
直接用HibernateTemplate
继承HibernateDaoSupport
46.Spring支持的ORM
Hibernate、MyBatis、JPA
47.如何通过HibernateDaoSupport将Spring和Hibernate结合起来?
public class PersonDAOHibernate extends HibernateDaoSupport implements PersonDAO
48.Spring支持的事务管理类型
·编程式事务管理:这意味你通过编程的方式管理事务,在代码中显示的指定事务的开启、提交、回滚,给你带来极大的灵活性,但是难维护。
·声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务, 底层是通过AOP实现的。
49.Spring框架的事务管理有哪些优点?
实现了业务代码和事务管理的分离。
50.你更倾向用那种事务管理类型?
声明式事务管理
51.解释AOP
52.Aspect切面
是对拦截的一类事务、方法的抽象,是一个类,如
UserControllerAspect,表示对UserController类层面的拦截,对类内部指定的方法进行拦截
AOP核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组API提供横切功能。比如,一个日志模块可以被称作日志的AOP切面。根据需求的不同,一个应用程序可以有若干切面。在Spring AOP中,切面通过带有@Aspect注解的类实现。
53.在SpringAOP中,关注点和横切关注的区别是什么?
关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。
横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。
54.连接点
连接点代表一个应用程序的某个位置,在这个位置我们可以插入一个AOP切面,它实际上是个应用程序执行Spring AOP的位置。
55.通知
通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。
Spring切面可以应用五种类型的通知:
before :前置通知,在一个方法执行前被调用。
after: 在方法执行之后调用的通知,无论方法执行是否成功。
after-returning: 仅当方法成功完成后执行的通知。
after-throwing: 在方法抛出异常退出时执行的通知。
around: 在方法执行之前和之后调用的通知。
56.切点
切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。
57.什么是引入?
引入允许我们在已存在的类中增加新的方法和属性。
58.什么是目标对象?
被一个或者多个切面所通知的对象。它通常是一个代理对象。也指被通知(advised)对象。
59.什么是代理?
代理是通知目标对象后创建的对象。从客户端的角度看,代理对象和目标对象是一样的。
60.有几种不同类型的自动代理?
BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
Metadata autoproxying
61.什么是织入。什么是织入应用的不同点?
织入是将切面和到其他应用类型或对象连接或创建一个被通知对象的过程。
织入可以在编译时,加载时,或运行时完成。
62.解释基于XMLSchema方式的切面实现。
在这种情况下,切面由常规类以及基于XML的配置实现。
63.解释基于注解的切面实现
在这种情况下(基于@AspectJ的实现),涉及到的切面声明的风格与带有java5标注的普通java类一致。
64.什么是Spring的MVC框架?
65.DispatcherServlet
66.WebApplicationContext
67.什么是SpringMVC框架的控制器?
68.@Controller注解
69.@RequestMapping注解
@RequestMapping
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
RequestMapping注解有六个属性,下面我们把她分成三类进行说明。
1、 value, method;
value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);
method: 指定请求的method类型, GET、POST、PUT、DELETE等;
2、 consumes,produces;
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
3、 params,headers;
params: 指定request中必须包含某些参数值是,才让该方法处理。
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
70.返回Json用什么注解?
@ResponseBody
[3] 22道面试常问的SpringMVC面试题!
1、什么是SpringMvc?
springMVC是一个MVC的开源框架,springMVC=struts2+spring,springMVC就相当于是Struts2加上sring的整合,但是这里有一个疑惑就是,springMVC和spring是什么样的关系呢?这个在百度百科上有一个很好的解释:
意思是说,springMVC是spring的一个后续产品,其实就是spring在原有springMVC是一个MVC的开源框架,springMVC=struts2+spring,springMVC就相当于是Struts2加上sring的整合,但是这里有一个疑惑就是,springMVC和spring是什么样的关系呢?这个在百度百科上有一个很好的解释:意思是说,springMVC是spring的一个后续产品,其实就是spring在原有基础上,又提供了web应用的MVC模块,可以简单的把springMVC理解为是spring的一个模块(类似AOP,IOC这样的模块),网络上经常会说springMVC和spring无缝集成,其实springMVC就是spring的一个子模块,所以根本不需要同spring进行整合。
2、Spring MVC的优点
a. 角色清晰: Servlet分发器DispatcherServlet, 映射处理器HandlerMapping、控制器、模型对象、视图解析器
a. 简化开发:
b. 易与Spring其他模块集成
基于接口编程、低耦合
springMVC支持多种视图技术,最常见的JSP技术以及其它技术包括Velocity
可定制的handler mapping和view resolution
清晰的角色划分:控制器(controller)、验证器(validator)、命令对象(command obect)、表单对象(form object)、模型对象(model object)、Servlet分发器(DispatcherServlet)、处理器映射(handler mapping)、试图解析器(view resoler)等等。每一个角色都可以由一个专门的对象来实现。
3、SpringMVC工作原理?
https://www.cnblogs.com/xiaoxi/p/6164383.html
4、SpringMVC流程?
1.客户端发送请求到DispatcherServlet
2.DispatcherServlet查询handlerMapping找到处理请求的Controller
3.Controller调用业务逻辑后,返回ModelAndView
4.DispatcherServlet查询ModelAndView,找到指定视图
5.视图将结果返回到客户端
5、SpringMvc的控制器是不是单例模式,如果是,有什么问题,怎么解决?
是
可能引发线程安全
是单例模式,所以在多线程访问的时候有线程安全问题,尽量不要用同步,会影响性能,解决方案是不要将共享资源定义为控制器的成员。
6、如果你也用过struts2.简单介绍下springMVC和struts2的区别有哪些?
7、SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代?
Controller或RestController,不能用呢其他注解代替
8、 @RequestMapping注解用在类上面有什么作用?
9、怎么样把某个请求映射到特定的方法上面?
直接在方法上面加上注解@RequestMapping,并且在这个注解里面写上要拦截的路径
URL
请求方式
10、如果在拦截请求中,我想拦截get方式提交的方法,怎么配置?
可以在@RequestMapping注解里面加上method=RequestMethod.GET
11、怎么样在方法里面得到Request,或者Session?
直接在方法的形参中声明request,SpringMvc就自动把request对象传入
12、我想在拦截的方法里面得到从前台传入的参数,怎么得到?
直接在形参里面声明这个参数就可以, 加上注解@RequestParam, 可以指定参数名称。如果不指定, 则参数名称必须和前端传递过来的参数名称相同。
13、如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象?
直接在方法中声明这个对象,SpringMvc就自动会把属性赋值到这个对象里面
14、SpringMvc中函数的返回值是什么?
返回值可以有很多类型,有String, ModelAndView
15、SpringMVC怎么样设定重定向和转发的?
在返回值前面加"forward:"就可以让结果转发,譬如"forward:user.do?name=method4"
在返回值前面加"redirect:"就可以让返回值重定向,譬如"redirect:http://www.baidu.com"
16、SpringMvc用什么对象从后台向前台传递数据的?
通过ModelMap对象,可以在这个对象里面用put方法,把对象加到里面,前台就可以通过el表达式拿到
17、SpringMvc中有个类把视图和数据都合并的一起的,叫什么?
ModelAnView
18、怎么样把ModelMap里面的数据放入Session里面?
可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key
19、SpringMvc怎么和AJAX相互调用的?
通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象
具体步骤如下
1.加入Jackson.jar
2.在配置文件中配置json的映射
3.在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解
20、当一个方法向AJAX返回特殊对象,譬如Object,List等,需要做什么处理?
加上@ResponseBody注解
21、SpringMvc里面拦截器是怎么写的
https://blog.csdn.net/binggetong/article/details/78831681#commentBox
22、讲下SpringMvc的执行流程
23、Spring MVC与Structs 2的区别
1、spring mvc的入口是servlet,而struts2是filter
2、Spring MVC属于轻量级, 简单, 基本实现了零配置; 而Structs2 配置复杂, 开发成本高。
3、拦截器实现机制上,Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。
4、SpringMVC开发效率和性能高于Struts2, SpringMVC可以认为已经100%零配置。
5、Spring MVC和Spring集成是无缝的, Strusts2与Spring集成需要额外的配置。
BeanFactory和FactoryBean的区别
https://www.cnblogs.com/aspirant/p/9082858.html
BeanFactory是接口, 是IOC容器最基本的规范, Spring有多种IOC容器的实现方式,如ApplicationContext、DefaultListableBeanFactory、XMLBeanFactory, 核心API是getBean方法
FactoryBean是接口, 是实现对象生成的工厂Bean, 有很多实现方式。
24、过滤器、拦截器、AOP的区别
https://blog.csdn.net/dreamwbt/article/details/82658842
过滤器
过滤器拦截的是URL
Spring中自定义过滤器(Filter)一般只有一个方法,返回值是void,当请求到达web容器时,会探测当前请求地址是否配置有过滤器,有则调用该过滤器的方法(可能会有多个过滤器),然后才调用真实的业务逻辑,至此过滤器任务完成。过滤器并没有定义业务逻辑执行前、后等,仅仅是请求到达就执行。
特别注意:过滤器方法的入参有request,response,FilterChain,其中FilterChain是过滤器链,使用比较简单,而request,response则关联到请求流程,
因此可以对请求参数做过滤和修改,同时FilterChain过滤链执行完,并且完成业务流程后,会返回到过滤器,此时也可以对请求的返回数据做处理。
作用:
a. 请求参数校验、过滤、修改
b. 返回数据处理
拦截器
拦截器拦截的也是URL
拦截器有三个方法,相对于过滤器更加细致,有被拦截逻辑执行前、后等。Spring中拦截器有三个方法:preHandle,postHandle,afterCompletion。分别表示如下
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o)表示被拦截的URL对应的方法执行前的自定义处理
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView)表示此时还未将modelAndView进行渲染,被拦截的URL对应的方法执行后的自定义处理,。
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e)表示此时modelAndView已被渲染,执行拦截器的自定义处理。
AOP(面向切面)
面向切面拦截的是类的元数据(包、类、方法名、参数等)
相对于拦截器更加细致,而且非常灵活,拦截器只能针对URL做拦截,而AOP针对具体的代码,能够实现更加复杂的业务逻辑。具体类型参照其他博客。
三者使用场景
顺序、使用越早性能越好。
三者功能类似,但各有优势,从过滤器--》拦截器--》切面,拦截规则越来越细致,执行顺序依次是过滤器、拦截器、切面。一般情况下数据被过滤的时机越早对服务的性能影响越小,因此我们在编写相对比较公用的代码时,优先考虑过滤器,然后是拦截器,最后是aop。比如权限校验,一般情况下,所有的请求都需要做登陆校验,此时就应该使用过滤器在最顶层做校验;日志记录,一般日志只会针对部分逻辑做日志记录,而且牵扯到业务逻辑完成前后的日志记录,因此使用过滤器不能细致地划分模块,此时应该考虑拦截器,然而拦截器也是依据URL做规则匹配,因此相对来说不够细致,因此我们会考虑到使用AOP实现,AOP可以针对代码的方法级别做拦截,很适合日志功能。
25、spring mvc9大组件