Java大三实习面试经验
由于在春招大厂面试时不给力,只能靠在BOSS直聘、拉钩等网址投简历,正好学校有个毕业招聘会,过去面试了Java的后台开发,以下是面试的一些问题,分享出来,大家可以借鉴下。
-
SpringBoot和SpringMVC区别
类比来看:
spring boot 相当于 腾讯的 Wegame,里面装了自家的各种游戏 如 spring data 、spring mvc……
你通过 We game 可以轻松 快速 安装、使用(引入、整合)Wegame旗下的游戏springmvc与springboot的联系和区别:
联系: Spring最初利用工厂模式(DI)和代理模式解耦应用组件,为了解耦开发了springmvc;而实际开发过程中,经常会使用到注解,程序的样板很多,于是开发了starter,这套就是springboot。 区别: 1.springboot是约定大于配置,可以简化spring的配置流程;springmvc是基于servlet的mvc框架,个人感觉少了model中的映射。 2.以前web应用要使用到tomat服务器启动,而springboot内置服务器容器,通过@SpringBootApplication中注解类中main函数启动即可。例如:
-
拦截器和过滤器区别
①拦截器是基于java的反射机制的,而过滤器是基于函数回调。 ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。 ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。 ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。 ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。 ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。 过滤器使用场景: 比如:过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符。 1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。 2、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面; 3、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录); 4、通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。 5、OpenSessionInView:如hibernate,在进入处理器打开Session,在完成后关闭Session。 拦截器使用场景: 拦截未登录用户等
filter Interceptor 多个的执行顺序 根据filter mapping配置的先后顺序 按照配置的顺序,但是可以通过order控制顺序 规范 在Servlet规范中定义的,是Servlet容器支持的 spring容器内的,是Spring框架支持的。 使用范围 只能用于Web程序中 既可以用于Web程序,也可以用于Application、Swing程序中。 深度 Filter在只在Servlet前后起作用 拦截器能够深入到方法前后、异常抛出前后等 -
面试官:“当使用过滤器时,此时Spring还没有注入bean,过滤时怎么进行业务操作?”
答:“不使用过滤器,使用Interceptor”
问:“如果一定要使用过滤器呢”
答:“母鸡”
后来经过查询,其实原理很简单,具体如下:
-
解决Filter不能注入Spring 的bean问题
来自博客https://blog.csdn.net/Evan_QB/article/details/82894834
我们都知道Filter的优先级大于Servlet,而springMVC又是基于Servlet来进行注入bean的,所以这就导致了Filter无法注入bean
接下来我们进行配置Filter,在web.xml中有:
<filter> <filter-name>loginFilter</filter-name> <filter-class>com.ipp.filter.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>loginFilter</filter-name> <url-pattern>/loanref/*</url-pattern> </filter-mapping>
在loginFilter中继续进行注入
@Component public class LoginFilter implements Filter{ @Autowired private IUserService userService; }
接下来编写一个Utils进行手动注入bean
@Component public class SpringUtils implements ApplicationContextAware{ private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if (SpringUtils.applicationContext == null) { SpringUtils.applicationContext = applicationContext; } } public static ApplicationContext getApplicationContext() { return applicationContext; } //根据name public static Object getBean(String name) { return getApplicationContext().getBean(name); } //根据类型 public static <T> T getBean(Class<T> clazz) { return getApplicationContext().getBean(clazz); } public static <T> T getBean(String name, Class<T> clazz) { return getApplicationContext().getBean(name, clazz); } }
接着在init方法中将userService的bean通过SpringUtils给注入进行
@Override public void init(FilterConfig config) throws ServletException{ if(userService==null){ userService=(IUserServcie)SpringUtils.getBean("userServiceImpl"); } }
-
-
SSO原理图(实现)
https://github.com/Hpsyche/note/blob/master/面试题/29.单点登录详解.md
-
jsp可以访问SpringBoot吗
因为没试过,我傻傻地回答了“可以”,然后就被面试官怼了,事后,查询资料,发现如下:
以下转自https://blog.csdn.net/yingxiake/article/details/51288727: spring boot 在springmvc的视图解析器方面就默认集成了ContentNegotiatingViewResolver和BeanNameViewResolver,在视图引擎上就已经集成自动配置的模版引擎,如下: 1. FreeMarker 2. Groovy 3. Thymeleaf 4. Velocity (deprecated in 1.4) 6. Mustache JSP技术spring boot 官方是不推荐的,原因有三: 1. 在tomcat上,jsp不能在嵌套的tomcat容器解析即不能在打包成可执行的jar的情况下解析 2. Jetty 嵌套的容器不支持jsp 3. Undertow
综上,springboot官方是不推荐使用JSP技术的,但是如果迫不得已要使用,也是有办法的,详情配置也可见以上博客。
-
Redis实现
就简单问了下redis的数据结构、在项目中的使用、还有实体存入redis的前提(序列化)
-
solr原理(索引原理)
这个其实我也是简单用了下,原理没怎么了解过,本想着“类似数据库索引的B+树”?,害怕出错就没说了,就简单讲了下linux上我索引的配置过程,中文切词器的导入,及索引、高亮的设置;面试官可能也看出我不太懂原理,就没有刁难我,事后查询了全文索引的原理,具体大概如下:
先了解两个概念,正排索引和倒排索引:
-
正排索引:
主要的意思就是说,当网络爬虫在Internet上收集信息的时候,会把收集到的网页进行处理,就是把对网页的内容进行分词(关键词),可以看成这样:
网页 关键词 网页A= 关键词1+关键词2+……. 网页B= 关键词1+关键词2+……. 网页C= 关键词1+关键词2+……. 具体分词的话不同分词器有不同的规则,不过大同小异,去辅助词、切词组等;
把一个网页分成一个个的关键词的过程就是一个正排索引的过程。
-
倒排索引:
用户查信息的时候,一般都是通过关键词来查询相应的信息。
倒排索引是这样的,倒排索引这个关键词之后跟了一堆网页。
关键词 网页 关键词1= 网页A+网页B+网页C+网页O+……. 关键词2= 网页B+网页P+网页Z+……. 关键词3= 网页D+网页T+网页Y+网页Z+…… 而solr就是一个倒排索引、基于Lucene的Java全文搜索引擎服务器。
当然,索引过程还涉及到tf-idf、svm等算法,此处不做详解。
-
-
商品上架和下架过程
就简单讲了下商品上下架时数据库的操作,还有(消息队列、索引库)的操作。
-
线程安全是什么?怎样算是线程安全?
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
-
如何实现线程安全?
怎么实现的话,我讲了同步的实现方法:同步方法、同步代码块、还有volatile关键字,其实应该还有使用重入锁实现线程同步;
-
volatile原理
以上两问详情均可见本人github地址:
[https://github.com/Hpsyche/note/blob/master/面试题/13.同步实现方法.md]
-
java重点有哪些
答:多线程、IO、集合、泛型、多态、 异常
-
mybatis二级缓存
答:大概知道二级缓存是以application为生命周期的(一级缓存是基于sqlsession为生命周期的),但没深入了解和使用过;
!!!!在面试完之后,面试官说挺好的,然后翻了一下我的简历,发现我是大三的,然后就说!!不招实习生!!也好,取了点面经!!