2019年3月24日阿里菜鸟网络一面总结

版权声明:转载标明来源! https://blog.csdn.net/qq_39213969/article/details/88777939

刚开始肯定是一贯的自我介绍,小小的211没什么可多介绍的。就说了名字,java学得还行,自己做过两个项目然后balabala…一段时间,问我喜欢做前端还是做后端,无语- -,简历写的不够清楚嘛,我说了后端,然后开始正式面试。

1.说下Spring-MVC由哪些部分组成,实现什么功能,结合你的项目说下具体流程。Model, view,Controller…

我说spring-mvc是基于java得实现了MVC设计模式得得请求驱动类型得轻量级Web框架,主要有三部分,Model层,视图层,以及控制器层组成。以一个查询功能为例子说明了这一个过程(emmm感觉表达能力不太行,说得有点乱)。
附上:Spring-MVC的执行过程以及图片。
(1)用户发送请求至前端控制器DispatcherServlet;
(2) DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;
(3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;
(4)DispatcherServlet 调用 HandlerAdapter处理器适配器;
(5)HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);
(6)Handler执行完成返回ModelAndView;
(7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
(8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
(9)ViewResolver解析后返回具体View;
(10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
(11)DispatcherServlet响应用户。

在这里插入图片描述

2.说一下Spring-MVC框架的Ioc(依赖注入)以及AOP(面向切面)。

Ioc是依赖注入,以往调用者要使用某个调用者对象时,需要自己new一个被调用者对象,这个过程往往是每个要实现功能的调用者都要去执行这个操作。这不但增加了系统的耦合度还增加了程序员编写代码的负担同时还增加了系统的可维护度以及后期系统的可扩展性。现在通过引入spring框架,其通过控制反转实现了松散耦合,对象们给出他们的依赖,而不是创建和查找对象的依赖的对象们。以后调用者需要某个依赖的对象时,有spring容易创建并交给调用者,由此实现了控制翻转。

AOP是面向切面编程,并且把应用的业务逻辑和系统服务分开。也就是说系统的多个功能模块的实现过程可能有相同的服务过程,例如,日志管理,系统缓存等。通过AOP可以将这些大家都有的功能结合到一起,通过AOP的动态代理(哭了,那好说下动态代理)去实现这些共有的系统服务,并且是可以在所有的系统功能均采用动态代理的方式来实现切面编程。

3.Spring Aop的动态代理

静态AOP 静态织入 在编译期,切面直接以字节码的形式编译到目标字节码文件中 对系统无性能影响 灵活性不够
动态AOP 动态代理 在运行期,目标类加载后,为接口动态生成代理类,将切面织入到代理类中 相对于静态AOP更加灵活
切入的关注点需要实现接口。对系统有一点性能影响

静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了

动态代理:即在运行期动态创建代理类,使用动态代理实现AOP需要4个角色:

被代理的类:即AOP里所说的目标对象
被代理类的接口
织入器:使用接口反射机制生成一个代理类,在这个代理类中织入代码
InvocationHandler切面:切面,包含了Advice和Pointcut

4.说一下快速排序的原理用伪代码的形式描述一遍。

(1)分解:以a[i]为基准元素,先从右向左扫描,比基准元素大的不改变位置,如果比基准原素小则与基准元素调换位置。然后在从左向右扫描,比基准元素小的不换位置否则与基准元素调换位置。这一顿操作之后便可以完成一趟快速排序,将数字序列分成a[p,q-1],a[q],a[q+1,r]这三个部分。且a[q]之前的元素都小于a[q]而a[q]之后的元素均大于a[q]得值。
(2)递归求解,通过递归的调用快速排序算法,分别对a[p,q-1]以及a[q+1,r]进行排序。
(3)当(2)中的两个子序列都排好序后,不需要任何的操作,整个序列a[p,r]就排好序。
伪代码:

 void quicksort(int left,int right) 
{ 
    int i,j,t,temp; 
    if(left>right) 
       return;                        
    temp=a[left]; //temp中存的就是基准数 
    i=left; 
    j=right; 
    while(i!=j) 
    { 
                   //顺序很重要,要先从右边开始找 
                   while(a[j]>temp && i<j) 
                            j--; 
                   //再找右边的 
                   while(a[i]<temp && i<j) 
                            i++; 
                   //交换两个数在数组中的位置 
                   if(i<j) 
                   { 
                            t=a[i]; 
                            a[i]=a[j]; 
                            a[j]=t; 
                   } 
    } 
    //最终将基准数归位 
    a[left]=a[i]; 
    a[i]=temp;          
    quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程 
    quicksort(i+1,right);//继续处理右边的 ,这里是一个递归的过程 
} 

5.问你一个java得知识说说 synchronized 和 volatile 的区别是什么?

volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。

6.你想参与阿里的那个业务部门?

(emmm其实我也不知道,所以所以说只要是后端的都可以把。。。。。。)
感觉自己回答得不好,有些知识已经看过了可是说的时候还是吞吞吐吐,还需要多锻炼。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_39213969/article/details/88777939