2022中高级Java开发工程师面试宝典

1.Spring框架用到了哪些设计模式?
答案:工厂模式(IOC容器就是个大工厂,BeanFacory和ApplicationContext接口)代理模式(AOP动态代理) 模板模式(jdbcTemplate|redisTemplate各种template) 观察者模式 策略模式(举例Resource类)
适配器模式和责任链模式(在SpringAOP中有一个很重要的功能就是使用的 Advice(通知) 来增强被代理类的功能,Advice主要有MethodBeforeAdvice、AfterReturningAdvice、ThrowsAdvice这几种。每个Advice都有对应的拦截器,如下:

Spring需要将每个 Advice 都封装成对应的拦截器类型返回给容器,所以需要使用适配器模式对 Advice 进行转换。)

2.Spring是如何解决循环依赖的?
答案:通过三级缓存,先在三级缓存中生成对应的bean(没有注入属性),此时这个bean因为没有属性还是个半成品,然后传递给二级缓存(还是不会注入属性),最后在一级缓存中注入属性,完成初始化。注:三级缓存只能解决属性注入依赖,构造器级别的循环依赖无法解决。

3.JDK的动态代理和CGLIB有什么区别?
答案:使用Jdk的动态代理前提是被代理类必须要实现接口,通过Proxy类和InvocationHandler接口生成动态代理类;CGlib不要求被代理类实现接口,原理是通过修改被代理类的字节码生成被代理类的子类。

4.Spring默认是单例还是多例,有几种类型?
答案:默认是单例的。一共有5种类型:singleton protype session globalsession request。

5.JUC包你都熟悉哪些常用的并发工具?
答:Semophore CycleBarrier CountDownLatch ConCurrentHashMap ConCurrentLinkedHashMap CopyOnWriteArrayList。

6.单位时间内如何控制线程的访问数量?
答:用Semophore信号量去控制,初始化时指定信号访问数量,acquire()方法获取访问许可证,release()方法释放许可证,可用信号量不足时,线程需排队等待。

7.池化技术了解吗?
答:创建线程和数据库连接时会使用线程池或连接池,有利于连接和线程的复用,减少频繁创建和销毁连接造成的不必要开销。

posted @ 2021-05-18 09:50  kingdumpling  阅读(474)  评论(0)    收藏  举报