【面试题】-java高级面试题汇总
日期: 2019-05-20 分类: 个人收藏 375次阅读
花大笔墨整理的一些java高级程序猿必会的面试题,其中有很多都是大厂面试题.
目录
9.HashMap原理/ConcurrentHashMap原理
26.TCP三次握手,TCP,TCP/IP协议,http协议,http1.0,http1.1,http2.0
29.死锁/活锁/饿锁/分布式锁/乐观锁/悲观锁 分别是什么,如何实现.
30.jdk1.7-1.11新特性以及lambda表达式使用.
1.spring IOC原理
IOC即控制反转,其实现主要依托于IOC容器,IOC容器有很多种,这里只提两种,一种是BeanFactory容器,另外一种是ApplicationContext容器,其中BeanFactory容器的初始化过程:
①读取bean.xml配置文件
②创建BeanFactory(new DefaultListableBeanFactory)
③创建资源读取器(new xmlBeanDefinitionReader,并将其与BeanFactory关联.
④将bean.xml中的信息解析成BeanDefinition元数据对象,并注册到IOC容器(BeanFactory)中,也就是将解析后的对象存入BeanDefinitionMap中.
ApplicationContext容器要比BeanFactory容器要高级一些,提供了一些额外的附加功能:支持不同的信息源,支持应用事件等.
至此,配置在bean.xml中的bean就被容器管理起来了,在注入时,通过扫描注解然后获取对应的bean进行注入即可.
2.spring bean生命周期
①Bean实例的创建
②为Bean实例设置属性
③初始化Bean的接口方法
④应用通过IOC容器获取Bean
⑤当容器销毁时,调用Bean的销毁方法doclose().
3.spring aop原理
spring aop是基于动态代理实现的,在此之前,你需要先了解设计模式-代理模式.
不同的是,spring aop更加智能,动态代理有2种实现方式,一种是通过JDK提供的代理,一种是通过CGLIB实现,前者要求被代理对象必须实现接口,或者则要求被代理对象必须可以被继承,如果加了final修饰则不行.
spring aop在对对象进行代理前会自行判断使用Jdk动态代理还是cglib,部分代码片段如下:
@Override
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
Class<?> targetClass = config.getTargetClass();
if (targetClass == null) {
throw new AopConfigException("TargetSource cannot determine target class: " +
"Either an interface or a target is required for proxy creation.");
}
//判断如果是接口,或者是被代理的类,则使用JDK动态代理
if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
return new JdkDynamicAopProxy(config);
}
//否则用cglib动态代理,(没有实现接口的类)
return new ObjenesisCglibAopProxy(config);
}
else {
//默认使用jdk动态代理
return new JdkDynamicAopProxy(config);
}
4.spring mvc原理
Spring mvc是以DispatcherServlet为核心实现的,具体的工作原理如图所示:
①用户发送请求至DispatcherServlet
② DispatcherServlet根据请求信息调用HandlerMapping,由HandlerMapping查找与请求匹配的Handler.
③找到Handler后,由对应的HandlerAdapter来调用真正的处理器来处理业务.
④处理完返回Model/View至Dispatcher.
⑤调用ViewResolver处理view,根据逻辑找到相应的View并返回
精华推荐