面试问题记录02

JDK8新特性

1.速度更快-红黑树

在于HashMap中链长度大于9时采取红黑树的存储结构(1.7为链表) ,除了添加操作,效率高于链表结构

2.代码更少-Lambda
3.强大的Stream API -Stream
4.便于并行-Paraller
5.最大化减少空指针异常-Optional

谈谈你对Spring的理解?

除了Spring 的反射,AOP与IOC 之外,我们还需要了解两个点

  • BeanDefinition
  • BeanPostProcessor

AOP
主要应用:日志、事务
一个交叉业务就是要切入系统的一个方面.
图一

图一

交叉业务的编程问题即为面向切面编程,AOP的目标就是使交叉业务模块化,做法是将切面代码移动到原始方法的周围:
在这里插入图片描述

图2
原先不使用AOP时(图一),交叉业务的代码直接硬编码在方法内部的前后,而AOP不把代码也在方法内部的前后呢?两点原因: - 首先,这与AOP的底层实现方式有关:动态代理其实就是代理对象调用目标对象的同名方法,并在调用前后加增强代码。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200605110556301.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDk4Njg5,size_16,color_FFFFFF,t_70)
  • 解耦
 @Autowired
	private UserService userService;
	 

以上userService一定是我们写的UserServiceImpl实例吗?
实际上,Spring依赖注入的对象不一定是我们自己写的类的实例,也可能是userServiceImpl的代理对象

  • 注入userServiceImpl对象

在这里插入图片描述
注入userServiceImpl的代理对象(CGLib动态代理)

在这里插入图片描述
为什么两次注入的对象不同?
因为第二次UserServiceImpl加了@Transactional注解
在这里插入图片描述
此时Spring读取到这个注解,便知道我们要使用事务。而我们编写的UserService类中并没有包含任何事务相关的代码。因此需要动态代理.

Java说,万物皆对象,但是Spring另外搞了BeanDefinition
BeanDefinition 是bean定义的一个顶级接口

在这里插入图片描述
很类似Class类,但两者并没有矛盾.
在这里插入图片描述
Class只是描述了一个类有哪些字段、方法,但是无法描述如何实例化这个bean.如果说Class类描述了一块猪肉,那么BeanDefinition就是描述做红烧肉的详细做法.

  • 单例?
  • 延迟加载?
  • 需要调用哪个初始化方法/销毁方法?
    Spring并不简简单单定义为一个容器
  • Spring首先会扫描解析指定位置的所有类得到Resources(可以理解为.Class文件)
  • 然后依照TypeFilter和@Condition注解决定是否将这个类解析为BeanDefinition
  • 稍后再把一个个BeanDefinition取出实例化成Bean

就好比猪肉需要拔毛,清洗,无论你要做红烧肉还是五花肉,都可以!
后置处理器

接下来就该讨论如何做红烧肉.
上面介绍的AOP,如果不加事务注解,那么注入的就是普通的userServiceimpl,加了以后返回的是代理对象。

返回代理对象就是Spring接管,帮你清洗了猪肉

很多人把Spring比作容器,其实潜意识里将Spring完全等同 于一个Map,实际上,真正存单例对象的map,只是Spring中很小的一部分,仅仅为BeanFactory的一个字段,我们更习惯称它为"单例池"。
在这里插入图片描述
这里的ApplicationContext和BeanFactory是接口,实际上都有各自的子类,比如注解驱动开发时,Spring中最关键的就是AnnotationConfigApplicationContext和DefaultListableBeanFactory

ApplicationContext 也实现了BeanFactory接口,但是作为容器,其实它是用来包含各种各样的组件的,而不是存bean

在这里插入图片描述
Spring“清洗猪肉”的关键就在于后置处理器:
在这里插入图片描述
上方的BeanFactory、BeanDefinitionRegistryPostProcessor、BeanPostProcessor都算是后置处理器,介绍一下BeanPostProcessor
在这里插入图片描述
BeanFactoryPostProcessor是用来干预BeanFactory创建的,而BeanPostProcessor是用来干预Bean的实例化。 例如,在普通Bean中注入ApplicationContext实例

@Autowired
ApplicationContext annotationConfigApplicationContext;

除了利用Spring本身的IOC容器自动注入外,我们还可以让Bean实现ApplicationContextAware接口
在这里插入图片描述
后期会调用setApplicationContext()方法传入ApplicationContext实例.

Spring官方文档:一般来说,应该避免使用它,它将代码耦合到Spring中,不遵循控制反转样式

代码具有高度的可扩展性。

在我们看来我们只要实现了一个接口,但是背地里Spring搞了个遍历所有的BeanPostProcessor,其中就包括处理实现了
ApplicationContextAware接口的bean的后置处理器:ApplicationContextAwareProcesspr.

在这里插入图片描述
要扩展的类虽然不确定,但处理流程是写死的
在这里插入图片描述
此时一个类实现ApplicationContextAware接口,有两层含义:

  • 作为后置处理器的判断依据,实现了接口才处理你
  • 提供被后置处理器调用的方法
    在这里插入图片描述
    利用后置处理器返回代理对象
    pom.xml

在这里插入图片描述
AppConfig
在这里插入图片描述
Calculator
在这里插入图片描述
CalCulatorImpl
在这里插入图片描述
后置处理器MyAspectJAutoProxyCreator
使用步骤:

  • 实现BeanPostProcessor
  • @Component加入Spring容器

在这里插入图片描述
在这里插入图片描述
先把@Component注释,此时Spring中没有自定义的后置处理器,返回的就是CalculatorImpl
在这里插入图片描述
把@Component加上m此时定义的MyAspectJAutoProxyCreator加入到Spring中的BeanPostProcessors中,会拦截到CalculatorImpl,并返回代理对象

在这里插入图片描述
部分转载

什么是 SpringMvc?
答:SpringMvc 是 spring 的一个模块,基于 MVC 的一个框架,无需中间整合层来整

Spring MVC 的优点:
答:

1)它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是 组件.并且和 Spring 提供的其他基础结构紧密集成.

2)不依赖于 Servlet API(目标虽是如此,但是在实现的时候确实是依赖于 Servlet 的)3)可以任意使用各种视图技术,而不仅仅局限于 JSP4)支持各种请求资源的映射策略5)它应是易于扩展的

SpringMVC 工作原理?
答:

1)客户端发送请求到 DispatcherServlet

2)DispatcherServlet 查询 handlerMapping 找到处理请求的 Controller

3)Controller 调用业务逻辑后,返回 ModelAndView

4)DispatcherServlet 查询 ModelAndView,找到指定视图

5)视图将结果返回到客户端

SpringMVC 流程?
答:

1)用户发送请求至前端控制器 DispatcherServlet。

2)DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。

3)处理器映射器找到具体的处理器(可以根据 xml 配置、注解进行查找),生成处理器及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet。

4)DispatcherServlet 调用 HandlerAdapter 处理器适配器。

5)HandlerAdapter 经过适配调用具体的处理器(Controller,也叫后端控制器)

6)Controller 执行完成返回 ModelAndView。

7)HandlerAdapter 将 controller 执行结果 ModelAndView 返回给 DispatcherServlet。

8)DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器。

9)ViewReslover 解析后返回具体 View。

10)DispatcherServlet 根据 View 进行渲染视图(即将模型数据填充至视图中)。

11)DispatcherServlet 响应用户。
SpringMvc 的控制器是不是单例模式,如果是,有什么问题,怎么解决?
答:是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解方案是在控制器里面不能写字段。

SpingMvc 中的控制器的注解一般用那个,有没有别的注解可以替代
答:一般用@Conntroller 注解,表示是表现层,不能用用别的注解代替

@RequestMapping 注解用在类上面有什么作用?
答:是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类有响应请求的方法都是以该地址作为父路径。

怎么样把某个请求映射到特定的方法上面?
答:直接在方法上面加上注解@RequestMapping,并且在这个注解里面写上要拦截的路

如果在拦截请求中,我想拦截 get 方式提交的方法,怎么配置?
答:可以在@RequestMapping 注解里面加上 method=RequestMethod.GET

怎么样在方法里面得到 Request,或者 Session?
答:直接在方法的形参中声明 request,SpringMvc 就自动把 request 对象传

我想在拦截的方法里面得到从前台传入的参数,怎么得到?
答:直接在形参里面声明这个参数就可以,但必须名字和传过来的参数一样

如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这象?
答:直接在方法中声明这个对象,SpringMvc 就自动会把属性赋值到这个对象里面。

SpringMvc 中函数的返回值是什么?
答:返回值可以有很多类型,有 String, ModelAndView,当一般用 String 比较好

SpringMVC 怎么样设定重定向和转发的?
答:在返回值前面加"forward:"就可以让结果转发,譬如"forward:user.do?name=method4返回值前面加"redirect:“就可以让返回值重定向,譬如"redirect:百度一下,你就知道”

SpringMvc 用什么对象从后台向前台传递数据的?
答:通过 ModelMap 对象,可以在这个对象里面用 put 方法,把对象加到里面,前台就可以过 el 表达式拿到。

SpringMvc 中有个类把视图和数据都合并的一起的,叫什么?
答:叫 ModelAndView。

怎么样把 ModelMap 里面的数据放入 Session 里面?
答:可以在类上面加上@SessionAttributes 注解,里面包含的字符串就是要放入 session 的 key

SpringMvc 怎么和 AJAX 相互调用的?
答:通过 Jackson 框架就可以把 Java 里面的对象直接转化成 Js 可以识别的 Json 对象具体步骤如下 :

1)加入 Jackson.jar

2)在配置文件中配置 json 的映射

3)在接受 Ajax 方法里面可以直接返回 Object,List 等,但方法前面要加上@ResponseBody注解

当一个方法向 AJAX 返回特殊对象,譬如 Object,List 等,需要做什么处理?
答:要加上@ResponseBody 注解

SpringMvc 里面拦截器是怎么写的?
答:有两种写法,一种是实现接口,另外一种是继承适配器类,然后在 SpringMvc 的配置文配置拦截器即可:

mvc:interceptors

<mvc:mapping path="/modelMap.do" />

</mvc:interceptor></mvc:interceptors>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值