共计 17652 个字符,预计需要花费 45 分钟才能阅读完成。
1. 请说一下 SpringMVC 的执行流程
步骤:
1. 用户向服务器发送申请,申请被 springMVC 前端控制器 DispatchServlet 捕捉;
2. 前端控制器申请处理器映射器:查问可能解决该申请的 Controller
3. 将找到的 Controller 门路返回给前端控制器.4. 前端控制器申请处理器适配器:找到可能解决该申请的处理器。
5. 处理器执行申请代码。(controller-service-dao)
6. 将解决后的后果和响应页面封装到 ModelAndView 对象中, 返回给处理器适配器.
7. 将 ModelAndView 对象返回给前端控制器.8. 前端控制器申请视图解析器:解析 View 对象,确定是哪个页面。
9. 视图解析器外部拼接,将页面名称拼接成实在的页面门路, 返回给前端控制器。(拼接前缀和后缀:View=hello –>(/WEB-INF/hello.jsp))
10. 视图渲染(将数据填充到页面中(request 域中)),最初将残缺的 view 展现给用户。
2. Spring MVC 的次要组件?
- 前端控制器 DispatcherServlet(不须要程序员开发)
作用:接管申请、响应后果,相当于转发器,有了 DispatcherServlet 就缩小了其它组件之间的耦合度。 - 处理器映射器 HandlerMapping(不须要程序员开发)
作用:依据申请的 URL 来查找 Handler - 处理器适配器 HandlerAdapter
留神:在编写 Handler 的时候要依照 HandlerAdapter 要求的规定去编写,这样适配器 HandlerAdapter 才能够正确的去执行 Handler。 - 处理器 Handler(须要程序员开发)
- 视图解析器 ViewResolver(不须要程序员开发)
作用:进行视图的解析,依据视图逻辑名解析成真正的视图(view) - 视图 View(须要程序员开发 jsp)
View 是一个接口,它的实现类反对不同的视图类型(jsp,freemarker,pdf 等等)
3. springMVC 和 struts2 的区别有哪些?
- springmvc 的入口是一个 servlet 即前端控制器(DispatchServlet),而 struts2 入口是一个 filter 过虑器(StrutsPrepareAndExecuteFilter)。
- springmvc 是基于办法开发(一个 url 对应一个办法),申请参数传递到办法的形参,能够设计为单例或多例(倡议单例),struts2 是基于类开发,传递参数是通过类的属性,只能设计为多例。
- Struts 采纳值栈存储申请和响应的数据,通过 OGNL 存取数据,springmvc 通过参数解析器是将 request 申请内容解析,并给办法形参赋值,将数据和视图封装成 ModelAndView 对象,最初又将 ModelAndView 中的模型数据通过 reques 域传输到页面。Jsp 视图解析器默认应用 jstl。
4. 如何解决 POST 申请中文乱码问题,GET 的又如何解决呢?
- 解决 post 申请乱码问题:
在 web.xml 中配置一个 CharacterEncodingFilter 过滤器,设置成 utf-8;
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>
/*</url-pattern>
</filter-mapping>
- get 申请中文参数呈现乱码解决办法有两个:
- ①批改 tomcat 配置文件增加编码与工程编码统一,如下:
<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
- ②另外一种办法对参数进行从新编码:
String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
ISO8859- 1 是 tomcat 默认编码,须要将 tomcat 编码后的内容按 utf- 8 编码。
5. SpringMVC 罕用的注解有哪些?
- @RequestMapping:用于解决申请 url 映射的注解,可用于类或办法上。用于类上,则示意类中的所有响应申请的办法都是以该地址作为父门路。
- @RequestBody:注解实现接管 http 申请的 json 数据,将 json 转换为 java 对象。
- @ResponseBody:注解实现将 conreoller 办法返回对象转化为 json 对象响应给客户。
6.SpringMvc 的 Controller 是不是单例模式,如果是,有什么问题,怎么解决?
答:是单例模式,所以在多线程拜访的时候有线程平安问题,会影响性能的。解决方案是尽量不要在 Controller 中应用类变量。
对于多例状况一般属性是不会共用的,对于动态属性会去共用这个属性。
对于单例状况一般属性和动态属性都会被共用。(controller 默认为单例)
springmvc 是基于办法开发的,办法里边的形参不会被共享,因而默认是多例。springmvc 如果要应用类变量,须要定义为多例的。Struts 是基于类的属性开发的,单例会共享属性,因而单例不平安,所以默认为多例。
7. 什么是 MVC 模式?
- MVC 的全名是 Model View Controller,是模型 (model)-视图(view)-控制器(controller) 的缩写,是一种软件设计榜样。它是用一种业务逻辑、数据与界面显示拆散的办法来组织代码,将泛滥的业务逻辑汇集到一个部件外面,在须要改良和个性化定制界面及用户交互的同时,不须要从新编写业务逻辑,达到缩小编码的工夫。
- V 即 View 视图是指用户看到并与之交互的界面。比方由 html 元素组成的网页界面,或者软件的客户端界面。MVC 的益处之一在于它能为利用程序处理很多不同的视图。在视图中其实没有真正的解决产生,它只是作为一种输入数据并容许用户操纵的形式。
- M 即 model 模型是指模型表示业务规定。在 MVC 的三个部件中,模型领有最多的解决工作。被模型返回的数据是中立的,模型与数据格式无关,这样一个模型能为多个视图提供数据,因为利用于模型的代码只需写一次就能够被多个视图重用,所以缩小了代码的重复性。
- C 即 controller 控制器是指控制器承受用户的输出并调用模型和视图去实现用户的需要,控制器自身不输入任何货色和做任何解决。它只是接管申请并决定调用哪个模型构件去解决申请,而后再确定用哪个视图来显示返回的数据。
8. SpringMVC 有哪些长处?
- SpringMVC 自身是与 Spring 框架联合而成的,它同时领有 Spring 的长处(例如依赖注入 DI 和切面编程 AOP 等)。
- SpringMVc 提供弱小的约定大于配置的契约式编程反对,即提供一种软件设计范式,缩小软件开发人员做决定的次数,开发人员仅需规定利用中不合乎约定的局部。
- 反对灵便的 URL 到页面控制器的映射。
- 能够不便地与其余视图技术 (JSP、FreeMarker 等) 进行整合。因为 SpringMVC 的模型数据往往是搁置在 Map 数据结构中的,因而其能够很不便地被其余框架援用。
- 领有非常简洁的异样解决机制。
- 能够非常灵便地实现数据验证、格式化和数据绑定机制,能够应用任意对象进行数据绑定操作。
- 反对 RestFul 格调。
9. 当一个办法向 AJAX 返回非凡对象, 譬如 Object,List 等, 须要做什么解决?
- 在办法上加 @ResponseBody 注解,示意该办法的返回值不论是什么类型,都会返回 JSON 格局的数据。
- 把原来 Controller 类上的 @Controller 注解替换为 @RestController 注解。@RestController = @Controller + @ResponseBody,表明该 Controller 类所有的办法都返回 JSON 格局的数据(没有加 @RequestMapping 注解的办法除外)。
退出 @ResponseBody 注解就能返回 JSON 格局数据的起因是
:SpringMVC 提供的 HttpMessageConverter 主动转为 JSON,如果应用了 Jackson 或者 Gson,不须要额定配置就能够主动返回 JSON 了,因为框架帮咱们提供了对应的 HttpMessageConverter,如果应用了 Alibaba 的 Fastjson 的话,则须要本人手动提供一个相应的 HttpMessageConverter 的实例。
10.SpringMVC 用什么对象从后盾向前台传递数据的?
- 应用 Map、Model 和 ModelMap 的形式,这种形式存储的数据是在 request 域中
@RequestMapping("/getUser")
public String getUser(Map<String,Object> map,Model model,ModelMap modelMap){
//1. 放在 map 里
map.put("name", "xq");
//2. 放在 model 里,个别是应用这个
model.addAttribute("habbit", "Play");
//3. 放在 modelMap 中
modelMap.addAttribute("city", "gd");
modelMap.put("gender", "male");
return "userDetail";
}
- 应用 request 的形式
@RequestMapping("/getUser")
public String getUser(Map<String,Object> map,Model model,ModelMap modelMap,HttpServletRequest request){
// 放在 request 里
request.setAttribute("user", userService.getUser());
return "userDetail";
}
- 应用 ModelAndView
@RequestMapping("/getUser")
public ModelAndView getUser(ModelAndView modelAndView) {mav.addObject("user", userService.getUser());
mav.setViewName("userDetail");
return modelAndView;
}
11. 怎么样把 ModelMap 外面的数据放入 session 外面?
在类上增加 @SessionAttributes
注解将指定的 Model 数据存储到 session 中。
@SessionAttributes
- 默认状况下 Spring MVC 将模型中的数据存储到 request 域中。当一个申请完结后,数据就生效了。如果要跨页面应用。那么须要应用到 session。而 @SessionAttributes 注解就能够使得模型中的数据存储一份到 session 域中。
- @SessionAttributes 只能定义在 Class,interface enum 上,作用是将指定的 Model 中的键值对增加至 session 中,不便在一个会话中应用。
@SessionAttributes 参数
- names:这是一个字符串数组。外面应写须要存储到 session 中数据的名称。
- types:依据指定参数的类型,将模型中对应类型的参数存储到 session 中。
- value:其实和下面的 names 是一样的。
@SessionAttributes(value={"names"},types={Integer.class})
@Controller
public class session{@RequestMapping("/session")
public String session(Model model){model.addAttributes("names", Arrays.asList("caoyc","zhh","cjx"));
model.addAttributes("age", 22);
return "/session";
}
}
在下面代码中,在类上增加 @SessionAttributes 注解,并指定将 names 名称的 Model 数据存储到 session 域中,以及将 Integer 类型的 Model 数据存储到 session 域中。
12.SpringMMV 中有个类把视图和数据都合并的一起的, 叫什么?
它就是 ModelAndView。
- 应用 ModelAndView 类存储解决完后的后果数据,以及显示该数据的视图。从名字上看 ModelAndView 中的 Model 代表模型,View 代表视图,从名字看就很好地解释了该类的作用。Controller 处理器调用模型层解决完用户申请后,把后果数据存储在该类的 model 属性中,把要返回的视图信息存储在该类的 view 属性中,而后把 ModelAndView 返回给前端控制器。前端控制器通过调用配置文件中定义的视图解析器,对该对象进行解析,最初把后果数据显示在指定的页面上。
- 返回指定页面
ModelAndView 构造方法能够指定返回的页面名称。
也能够通过 setViewName()办法跳转到指定的页面。- 返回所需数值
应用 addObject()设置须要返回的值,addObject()有几个不同参数的办法,能够默认和指定返回对象的名字。
13.Springmvc 中零碎如何分层?
零碎分为体现层(UI):数据的展示,操作页面,申请转发。
业务层(服务层):封装业务解决逻辑
长久层(数据拜访层):封装数据拜访逻辑
各层之间的关系:表示层通过接口调用业务层,业务层通过接口调用长久层,这样,当下一层发生变化扭转,不影响上一层的数据。MVC 是一种体现层的架构
14. Springmvc 中拦截器如何应用
定义拦截器,实现 HandlerInterceptor 接口。接口中提供三个办法。
preHandle:进入 Handler 办法之前执行,用于身份认证、身份受权,比方身份认证,如果认证通过示意以后用户没有登陆,须要此办法拦挡不再向下执行
postHandle:进入 Handler 办法之后,返回 modelAndView 之前执行,利用场景从 modelAndView 登程:将专用的模型数据(比方菜单导航) 在这里传到视图,也能够在这里对立指定视图
afterCompletion:执行 Handler 实现执行此办法,利用场景:对立异样解决,对立日志解决
拦截器配置:
针对 HandlerMapping 配置 (不举荐):springmvc 拦截器针对 HandlerMapping 进行拦挡设置,如果在某个 HandlerMapping 中配置拦挡,通过该 HandlerMapping 映射胜利的 handler 最终应用该 拦截器。(个别不举荐应用)
相似全局的拦截器:springmvc 配置相似全局的拦截器,springmvc 框架将配置的相似全局的拦截器注入到每个 HandlerMapping 中
15. 介绍一下 Spring 的事务管理
事务就是对一系列的数据库操作(比方插入多条数据)进行对立的提交或回滚操作,如果插入胜利,那么一起胜利,如果两头有一条出现异常,那么回滚之前的所有操作。
这样能够防止出现脏数据,避免数据库数据呈现问题。开发中为了防止这种状况个别都会进行事务管理。Spring 中也有本人的事务管理机制,个别是应用 TransactionMananger 进行治理,能够通过 Spring 的注入来实现此性能。
sping 的事务管理的两种形式:
1、编程式(粒度是到代码块级别);
编程式次要应用 transactionTemplate;手动编程治理事务
2、申明式(粒度是到办法级别);
通过 AOP 实现,其本质是对办法前后进行拦挡,而后在指标办法开始之前创立或者退出一个事务,在执行完指标办法之后依据执行状况提交或者回滚事务。申明式事务最大的长处就是不须要通过编程的形式治理事务,这样就不须要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相干的事务规定申明(或通过基于 @Transactional 注解的形式),便能够将事务规定利用到业务逻辑中。
16. spring 中的 BeanFactory 与 ApplicationContext 的作用有哪些?
Spring 通过一个配置文件来形容 Bean 及 Bean 之间的依赖关系,利用 Java 的反射性能实例化 Bean 并建设 Bean 之间的依赖关系。Sprig 的 IoC 容器在实现这些底层工作的根底上,还提供了 Bean 实例缓存、生命周期治理、Bean 实例代理、事件公布、资源装载等高级服务。
Spring 提供了两种类型的 IOC 容器实现.
BeanFactory: IOC 容器的根本实现.
ApplicationContext: 提供了更多的高级个性. 是 BeanFactory 的子接口.
Bean 工厂(com.springframework.beans.factory.BeanFactory)是 Spring 框架中最外围的接口,它提供了高级 IoC 的配置机制。BeanFactory 使治理不同类型的 Java 对象成为可能。而利用上下文(com.springframework.context.ApplicationContext)建设在 BeanFactory 根底之上,提供了更多面向利用的性能,它提供了国际化反对和框架事件体系,更易于创立理论利用。
咱们个别称 BeanFactory 为 IoC 容器,而称 ApplicationContext 为利用上下文或 Spring 容器。
17. 你对 Spring 框架的了解,Spring 框架有哪些模块?
Spring 是一个轻量级的 IoC 和 AOP 容器框架,是为 Java 应用程序提供基础性服务的一套框架,目标是用于简化企业应用程序的开发,它使得开发者只须要关怀业务需要。
Spring,一种用来简化企业应用级开发的一种开源框架。
简化开发:它对罕用的 API 做了封装,比方对 JDBC 的封装,应用 Spring JDBC 拜访数据库,就不须要思考如何获取连贯和敞开的问题。
解耦:Spring 帮咱们管理软件之间的依赖关系,这样对象之间的耦合性就升高了,这样的维护性就失去了进步。
集成其它框架:不便扩大和优化其性能,例如和 Mybatis 的集成等。
Spring 框架是依照设计模式精心打造的,这使得咱们在开发环境中,能不便的应用框架,不必思考后盾是怎么进行的。
Spring 容器是 Spring 框架中一个外围的模块,用来治理对象的创立,销毁和初始化等操作,以及对象之间的依赖关系等。
次要包含以下七个模块:
Spring Context:提供框架式的 Bean 拜访形式,以及企业级性能(JNDI、定时工作等);
Spring Core:外围类库,所有性能都依赖于该类库,提供 IOC 和 DI 服务;
Spring AOP:AOP 服务;
Spring Web:提供了根本的面向 Web 的综合个性,提供对常见框架如 Struts2 的反对,Spring 可能治理这些框架,将 Spring 的资源注入给框架,也能在这些框架的前后插入拦截器;
Spring MVC:提供面向 Web 利用的 Model-View-Controller,即 MVC 实现;
Spring DAO:对 JDBC 的形象封装,简化了数据拜访异样的解决,并能对立治理 JDBC 事务;
Spring ORM:对现有的 ORM 框架的反对。
18. 什么是管制反转(IOC),什么是依赖注入(DI)?
IOC:就是对象之间的依赖关系由容器来创立,对象之间的关系原本是由咱们开发者本人创立和保护的,在咱们应用 Spring 框架后,对象之间的关系由容器来创立和保护,将开发者做的事让容器做,这就是管制反转。BeanFactory 接口是 Spring Ioc 容器的外围接口。
DI:咱们在应用 Spring 容器的时候,容器通过调用 set 办法或者是结构器来建设对象之间的依赖关系。
管制反转是指标,依赖注入是咱们实现管制反转的一种伎俩。
19. Spring Bean 的生命周期?
Spring 作为以后 Java 最风行、最弱小的轻量级框架,受到了程序员的热烈欢迎。精确的理解 Spring Bean 的生命周期是十分必要的。咱们通常应用 ApplicationContext 作为 Spring 容器。这里,咱们讲的也是 ApplicationContext 中 Bean 的生命周期。而实际上 BeanFactory 也是差不多的,只不过处理器须要手动注册。
简略来说,Spring Bean 的生命周期只有四个阶段:实例化 Instantiation –> 属性赋值 Populate –> 初始化 Initialization –> 销毁 Destruction
但具体来说,Spring Bean 的生命周期蕴含下图的流程:
(1)实例化 Bean
对于 BeanFactory 容器,当客户向容器申请一个尚未初始化的 bean 时,或初始化 bean 的时候须要注入另一个尚未初始化的依赖时,容器就会调用 createBean 进行实例化。
对于 ApplicationContext 容器,当容器启动完结后,通过获取 BeanDefinition 对象中的信息,实例化所有的 bean。
(2)设置对象属性(依赖注入)
实例化后的对象被封装在 BeanWrapper 对象中,紧接着,Spring 依据 BeanDefinition 中的信息 以及 通过 BeanWrapper 提供的设置属性的接口实现属性设置与依赖注入。
(3)解决 Aware 接口
Spring 会检测该对象是否实现了 xxxAware 接口,通过 Aware 类型的接口,能够让咱们拿到 Spring 容器的一些资源:
①如果这个 Bean 实现了 BeanNameAware 接口,会调用它实现的 setBeanName(String beanId)办法,传入 Bean 的名字;
②如果这个 Bean 实现了 BeanClassLoaderAware 接口,调用 setBeanClassLoader()办法,传入 ClassLoader 对象的实例。
②如果这个 Bean 实现了 BeanFactoryAware 接口,会调用它实现的 setBeanFactory()办法,传递的是 Spring 工厂本身。
③如果这个 Bean 实现了 ApplicationContextAware 接口,会调用 setApplicationContext(ApplicationContext)办法,传入 Spring 上下文。
(4)BeanPostProcessor 前置解决
如果想对 Bean 进行一些自定义的前置解决,那么能够让 Bean 实现了 BeanPostProcessor 接口,那将会调用 postProcessBeforeInitialization(Object obj, String s)办法。
(5)InitializingBean
如果 Bean 实现了 InitializingBean 接口,执行 afeterPropertiesSet()办法。
(6)init-method
如果 Bean 在 Spring 配置文件中配置了 init-method 属性,则会主动调用其配置的初始化办法。
(7)BeanPostProcessor 后置解决
如果这个 Bean 实现了 BeanPostProcessor 接口,将会调用 postProcessAfterInitialization(Object obj, String s)办法;因为这个办法是在 Bean 初始化完结时调用的,所以能够被利用于内存或缓存技术;
以上几个步骤实现后,Bean 就曾经被正确创立了,之后就能够应用这个 Bean 了。
(8)DisposableBean
当 Bean 不再须要时,会通过清理阶段,如果 Bean 实现了 DisposableBean 这个接口,会调用其实现的 destroy()办法。
(9)destroy-method
最初,如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性,会主动调用其配置的销毁办法。
20. Spring 框架中都用到了哪些设计模式?
单例模式 : Spring 中的 Bean 默认都是单例的。
工厂模式 : Spring 应用工厂模式通过 BeanFactory、ApplicationContext 创立 bean 对象。
模板办法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就应用到了模板模式。
代理模式 : Spring AOP 性能的实现。
观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个利用。
适配器模式 :Spring AOP 的加强或告诉 (Advice) 应用到了适配器模式、spring MVC 中也是用到了适配器模式适配 Controller。
装璜者模式 : 咱们的我的项目须要连贯多个数据库,而且不同的客户在每次拜访中依据须要会去拜访不同的数据库。这种模式让咱们能够依据客户的需要可能动静切换不同的数据源。
21. Spring AOP(面向切面)编程的原理?
AOP 面向切面编程,它是一种思维。它就是针对业务处理过程中的切面进行提取,以达到优化代码的目标,缩小反复代码的目标。就比方,在编写业务逻辑代码的时候,咱们习惯性的都要写:日志记录,事物管制,以及权限管制等,每一个子模块都要写这些代码,代码显著存在反复。这时候,咱们使用面向切面的编程思维,采纳横切技术,将代码中反复的局部,不影响主业务逻辑的局部抽取进去,放在某个中央进行集中式的治理,调用。造成日志切面,事物管制切面,权限管制切面。这样,咱们就只须要关系业务的逻辑解决,即进步了工作的效率,又使得代码变的简洁优雅。这就是面向切面的编程思维,它是面向对象编程思维的一种扩大。
AOP 的应用场景:缓存、权限治理、内容传递、错误处理、懒加载、记录跟踪、优化、校准、调试、长久化、资源池、同步治理、事物管制等。AOP 的相干概念:切面(Aspect)连接点(JoinPoint) 告诉(Advice)切入点(Pointcut)代理(Proxy):织入(WeaVing)
Spring AOP 的编程原理?代理机制 JDK 的动静代理:只能用于实现了接口的类产生代理。Cglib 代理:针对没有实现接口的类产生代理,利用的是底层的字节码加强技术,生成以后类的子类对象。
(1)连接点(Join point):指程序运行过程中所执行的办法。在 Spring AOP 中,一个连接点总代表一个办法的执行。
(2)切面(Aspect):被抽取进去的公共模块,能够用来会横切多个对象。Aspect 切面能够看成 Pointcut 切点 和 Advice 告诉 的联合,一个切面能够由多个切点和告诉组成。
在 Spring AOP 中,切面能够在类上应用 @AspectJ 注解来实现。
(3)切点(Pointcut):切点用于定义 要对哪些 Join point 进行拦挡。
切点分为 execution 形式和 annotation 形式。execution 形式能够用门路表达式指定对哪些办法拦挡,比方指定拦挡 add、search。annotation 形式能够指定被哪些注解润饰的代码进行拦挡。
(4)告诉(Advice):指要在连接点(Join Point)上执行的动作,即加强的逻辑,比方权限校验和、日志记录等。告诉有各种类型,包含 Around、Before、After、After returning、After throwing。
(5)指标对象(Target):蕴含连接点的对象,也称作被告诉(Advice)的对象。因为 Spring AOP 是通过动静代理实现的,所以这个对象永远是一个代理对象。
(6)织入(Weaving):通过动静代理,在指标对象(Target)的办法(即连接点 Join point)中执行加强逻辑(Advice)的过程。
(7)引入(Introduction):增加额定的办法或者字段到被告诉的类。Spring 容许引入新的接口(以及对应的实现)到任何被代理的对象。例如,你能够应用一个引入来使 bean 实现 IsModified 接口,以便简化缓存机制。
几个概念的关系图能够参考下图:
AOP 实现的关键在于代理模式,AOP 代理次要分为动态代理和动静代理。动态代理的代表为 AspectJ;动静代理则以 Spring AOP 为代表。
(1)AspectJ 是动态代理,也称为编译时加强,AOP 框架会在编译阶段生成 AOP 代理类,并将 AspectJ(切面)织入到 Java 字节码中,运行的时候就是加强之后的 AOP 对象。
(2)Spring AOP 应用的动静代理,所谓的动静代理就是说 AOP 框架不会去批改字节码,而是每次运行时在内存中长期为办法生成一个 AOP 对象,这个 AOP 对象蕴含了指标对象的全副办法,并且在特定的切点做了加强解决,并回调原对象的办法。
Spring AOP 中的动静代理次要有两种形式,JDK 动静代理和 CGLIB 动静代理:
① JDK 动静代理只提供接口的代理,不反对类的代理,要求被代理类实现接口。JDK 动静代理的外围是 InvocationHandler 接口和 Proxy 类,在获取代理对象时,应用 Proxy 类来动态创建指标类的代理类(即最终真正的代理类,这个类继承自 Proxy 并实现了咱们定义的接口),当代理对象调用实在对象的办法时,InvocationHandler 通过 invoke()办法反射来调用指标类中的代码,动静地将横切逻辑和业务编织在一起;
InvocationHandler 的 invoke(Object proxy,Method method,Object[] args):proxy 是最终生成的代理对象; method 是被代理指标实例的某个具体方法;args 是被代理指标实例某个办法的具体入参, 在办法反射调用时应用。
② 如果被代理类没有实现接口,那么 Spring AOP 会抉择应用 CGLIB 来动静代理指标类。CGLIB(Code Generation Library),是一个代码生成的类库,能够在运行时动静的生成指定类的一个子类对象,并笼罩其中特定办法并增加加强代码,从而实现 AOP。CGLIB 是通过继承的形式做的动静代理,因而如果某个类被标记为 final,那么它是无奈应用 CGLIB 做动静代理的。
(3)动态代理与动静代理区别在于生成 AOP 代理对象的机会不同,相对来说 AspectJ 的动态代理形式具备更好的性能,然而 AspectJ 须要特定的编译器进行解决,而 Spring AOP 则无需特定的编译器解决。
IoC 让相互协作的组件放弃涣散的耦合,而 AOP 编程容许你把遍布于利用各层的性能分离出来造成可重用的性能组件。
22.WebService 如何与客户端交互
① webServices 通过 SOAP 协定进行参数的接管与返回值的传递。
② SOAP 协定在 web 上提供软件服务,应用 WSDL 文件进行阐明,通过 UDDI 进行注册
③ WSDL 文件是一个 XML 文档,用于阐明一组 SOAP 音讯以及如何替换这些信息,大多数状况下由软件主动生成和应用
④ XML 是一种扩大型可标记语言,面向短期长期数据和万维网络。
⑤ UDDI 是一个次要针对 web 服务供应商和使用者的我的项目,在用户可能调用 web 服务之前,必须确定这个服务蕴含哪些商务办法,找到被调用的接口定义,还要服务端来编制软件;UDDI 是一种依据形容文章来疏导零碎查找响应服务的机制,UDDI 利用 SOAP 音讯机制来公布、编译、浏览及查找注册信息,它采纳 XML 格局来封装各种不同类型的数据, 并且发送到注册核心来返回须要的数据。
23. 拦截器和过滤器的区别
① 拦截器 inteceptor 是基于 java 的反射机制实现的;
过滤器 Filter 是基于函数回调实现(filter 接口中的 doFilter 办法是回调函数实现的)
② 拦截器不依赖于 servlet 容器;
过滤器 filter 依赖 servlet,没有 servlet 无奈回调 doFilter
③ 拦截器只能对 action 申请起作用;
而 filter 能够对所有申请起作用,filter 过滤范畴比拦截器大
④ 拦截器能够拜访 action 上下文,值栈里的对象;
而过滤器 filter 不能;
⑤ 在 action 的生命周期中,拦截器能够屡次被调用;
而过滤器只能在容器初始化时被调用一次;
⑥ 拦截器能够获取 IOC 容器中的各个 bean,而过滤器不行;
24. Spring MVC 异样解决
1. 应用 @ExceptionHandler 注解。
public class AccountController {
@ExceptionHandler
public void handleException() {}
}
@ExceptionHandler 是 Controller 级别的,不是整个应用程序全局无效。给每个 controller 增加对应的 @ExceptionHandler 办法会很繁琐。能够让所有 Controller 类继承 BaseController 类,在 BaseController 类外面增加 @ExceptionHandler 润饰的办法进行异样解决。
- 应用 HandlerExceptionResolver 能够实现一个对立的异样解决机制。Spring 提供了以下 HandlerExceptionResolver 能够应用:
ExceptionHandlerExceptionResolver 是 @ExceptionHandler 机制工作的外围组件。
DefaultHandlerExceptionResolver 用于将规范的 Spring 异样解析为相应的 http 状态码。
ResponseStatusExceptionResolver 次要用于把润饰自定义异样的 @ResponseStatus 注解映射对应异样到相应的 http 状态码。
SimpleMappingExceptionResolver 和 AnnotationMethodHandlerExceptionResolver
自定义 HandlerExceptionResolver 能够返回一个 ModelAndView 对象,能够设置须要的任何内容。
- 新的 @ControllerAdvice 提供了一个全局的 @ExceptionHandler 异样解决机制。
@ControllerAdvice
public class ExceptionHandler {@ExceptionHandler(Exception.class)
public Result handleException(Exception e) {// todo}
}
@ControllerAdvice 容许把扩散在多个 Controller 的 @ExceptionHandler 合并到单个全局错误处理组件中。
25. Spring MVC 进行传值的形式有哪些?
(1)、页面传值到控制器有三种形式:
应用 Request 传值的特点:间接,然而不能主动进行类型转换。
通过属性传值的特点:
第一、变量名必须和表单组件的 name 值雷同
第二、能够实现类型转换
第三、进行类型转换时可能会出现异常
应用 Bean 对象传值的特点:
第一、如果前端提交数据过多,倡议应用此形式
第二、把表单组件的 name 属性值封装到 Bean 类中,
第三、办法的参数传递封装类型的对象即可
(2)、控制器传值到页面有三种形式:
应用 Request 和 Session 对象
应用 ModelAndView 传值的特点:
第一、能够在 ModelAndView 构造方法中设置一个 Map 对象
第二、Map 对象通过框架解决后,会把 key-value 设置到 Request 对象中。
ModelMap 传值的特点:
第一、ModelMap 是框架提供的 Map 汇合
第二、ModelMap 同样被框架设置到 Request 对象中。
26. Spring MVC 如何进行乱码解决?
对于 POST 乱码,在 web.xml 文件中增加 POST 乱码过滤器——CharacterEncodingFilter
对于 GET 申请中文参数呈现乱码的状况,解决方案:
(1)、批改 Tomcat 配置文件,增加编码与工作编码统一
<Connector URLEncoding=”utf-8″ connectionTimeout=”2000″ port=”8080″ protocol=”HTTP/1.1″ redirectPort=”8443″/>
(2)、对参数进行从新编码
String userName=new String(request.getParamter(“username”.getBytes(“ISO8859-1″,”utf-8”)))
ISO8859- 1 是 Tomcat 默认编码,须要将 Tomcat 编码后的内容按 utf- 8 编码。
26. Spring MVC 拦截器的三个办法的执行机会是什么?
当两个拦截器都实现放行操作时,程序为 preHanle1、preHandle2、postHandle2、postHandle1、afterCompletion2、afterCompletion1;
当第一个拦截器 preHandle 返回 false, 也就是对其进行拦挡时,第二个拦截器是齐全不执行的,第一个拦截器只执行 preHandle 局部。
当第一个拦截器 preHandle 返回 True,第二个拦截器 preHandle 返回 false,程序为 preHandle1、preHandle2、afterCompletion1
27. 什么是 ContextLoaderListener,它的作用是什么?
ContextLoaderListener 是一个监听器,这有助于疏导 Spring MVC 的。顾名思义它加载并创立 ApplicationContext,因而不用编写显式代码来创立它。应用程序上下文是 Spring bean 来到的中央。对于 Web 应用程序,有一个名为 WebAppliationContext 的子类。
ContextLoaderListener 还将 ApplicationContext 的生命周期与 ServletContext 的生命周期分割起来。这能够应用 getServletContext()办法从 WebApplicationContext 获取 ServletContext。
28. 传入申请如何映射到控制器和办法?
有时也会问这个问题 DispatcherServlet 如何晓得哪个 Controller 应该解决申请?
Spring 应用处理程序映射将控制器与申请相关联,两个罕用的处理程序映射是 BeanNameUrlHandlerMapping 和 SimpleUrlHandlerMapping。
在 BeanNameUrlHandlerMapping 中,当申请 url 与 bean 的名称匹配时,bean 定义中的类是将解决申请的控制器。
另一方面,在 SimpleUrlHandlerMapping 中,映射更明确。能够指定 URL 的数量,并且每个 URL 能够与控制器显式关联。
顺便说一句,如果你应用正文来配置 Spring MVC,那么应该应用 @RequestMapping 正文将传入申请映射到控制器和处理程序办法。
还能够通过 URI 门路,查问参数,申请的 HTTP 办法以及申请中存在的 HTTP 标头配置 @RequestMapping 批注。
29. @RequestParam 用于什么?
@RequestParam 是一个 Spring MVC 正文,其被用于提取从 URL 中控制器的处理程序办法申请参数或查问参数,如下所示:
public String personDetail(@RequestParam(“id”)long id){
....
return“personDetails”;
}
@RequestParam 正文也反对数据类型转换,例如这里能够看到一个 String 被主动转换为 long,但它也可能导致一个异样,如果查问参数不存在或类型不匹配的状况下 还能够应用 requried = false 使参数成为可选参数,例如 @RequestParam(value =“id”,required = false)
30. SpringBoot、SpringMVC、Spring 有什么区别?
Springboot 是简化配置,将 mybatis 中的配置数据源,主配置文件等配置,spring、springMVC 的配置文件都用 springboot 的 yml 文件配置,极大的简化了配置,使我的项目能够疾速的启动起来。
SpringMVC 是通过(model),V(view),C(controller)的构造进行分层,从而实现前后端拆散的成果,而后通过前端控制器(DispatcherServlet),处理器映射器(HandlerMapping),处理器适配器(HandlerAdapter),视图解析器(ViewResolver),将各层有机的组织起来,使每个人都有不同的分工从而放慢了开发的效率。
Spring 是由 Aop 面向切面和 IOC 管制翻转(又称作 DI 依赖注入),面向切面是把主办法和其余的一些无关的办法拆散开来,从而达到升高耦合的成果,管制翻转是指将原先是由 new 创立的对象,各个类之间的依赖较强,将创建对象的权力交托给 ioc 容器后,由 ioc 容器来创建对象,使耦合度减小,进步了效率。
31. SpringMVC 接口解释
(1)DispatcherServlet 接口:
Spring 提供的前端控制器,所有的申请都有通过它来对立散发。在 DispatcherServlet 将申请分发给 Spring Controller 之前,须要借助于 Spring 提供的 HandlerMapping 定位到具体的 Controller。
(2)HandlerMapping 接口:
可能实现客户申请到 Controller 映射。
(3)Controller 接口:
须要为并发用户解决上述申请,因而实现 Controller 接口时,必须保障线程平安并且可重用。
Controller 将解决用户申请,这和 Struts Action 表演的角色是统一的。一旦 Controller 解决完用户申请,则返回 ModelAndView 对象给 DispatcherServlet 前端控制器,ModelAndView 中蕴含了模型(Model)和视图(View)。
从宏观角度思考,DispatcherServlet 是整个 Web 利用的控制器;从宏观思考,Controller 是单个 Http 申请处理过程中的控制器,而 ModelAndView 是 Http 申请过程中返回的模型(Model)和视图(View)。
(4)ViewResolver 接口:
Spring 提供的视图解析器(ViewResolver)在 Web 利用中查找 View 对象,从而将相应后果渲染给客户。
我的项目举荐:
2000 多 G 的计算机各行业电子资源分享(继续更新)
2020 年微信小程序全栈我的项目之喵喵交友【附课件和源码】
Spring Boot 开发小而美的集体博客【附课件和源码】
Java 微服务实战 296 集大型视频 - 谷粒商城【附代码和课件】
Java 开发微服务畅购商城实战【全 357 集大我的项目】- 附代码和课件
最全最具体数据结构与算法视频 -【附课件和源码】