java面试机试题,springboot面试知识点总结_java sprintboot 面试-程序员宅基地

技术标签: Java  面试  spring boot  java  

前言

在学习Java基础的过程中,泛型绝对算得上是一个比较难理解的知识点,尤其对于初学者而言,而且就算是已经有基础的Java程序员,可能对泛型的理解也不是那么透彻,属于那种看了明白,时间长了就忘的那种,究其根本,还是对泛型不够理解。

大部分人对泛型的认识:“基础知识,但是比较模糊”

1.简单工厂(非23种设计模式中的一种)

实现方式:

BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。

实质:

由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。

实现原理:

bean容器的启动阶段:

  • 读取bean的xml配置文件,将bean元素分别转换成一个BeanDefinition对象。
  • 然后通过BeanDefinitionRegistry将这些bean注册到beanFactory中,保存在它的一个ConcurrentHashMap中。
  • 将BeanDefinition注册到了beanFactory之后,在这里Spring为我们提供了一个扩展的切口,允许我们通过实现接口BeanFactoryPostProcessor 在此处来插入我们定义的代码。典型的例子就是:PropertyPlaceholderConfigurer,我们一般在配置数据库的dataSource时使用到的占位符的值,就是它注入进去的。

容器中bean的实例化阶段:

实例化阶段主要是通过反射或者CGLIB对bean进行实例化,在这个阶段Spring又给我们暴露了很多的扩展点:

  • 各种的Aware接口,比如 BeanFactoryAware,对于实现了这些Aware接口的bean,在实例化bean时Spring会帮我们注入对应的BeanFactory的实例。
  • BeanPostProcessor接口,实现了BeanPostProcessor接口的bean,在实例化bean时Spring会帮我们调用接口中的方法。
  • InitializingBean接口,实现了InitializingBean接口的bean,在实例化bean时Spring会帮我们调用接口中的方法。
  • DisposableBean接口,实现了BeanPostProcessor接口的bean,在该bean死亡时Spring会帮我们调用接口中的方法。

设计意义:

**松耦合。**可以将原来硬编码的依赖,通过Spring这个beanFactory这个工厂来注入依赖,也就是说原来只有依赖方和被依赖方,现在我们引入了第三方——spring这个beanFactory,由它来解决bean之间的依赖问题,达到了松耦合的效果.

**bean的额外处理。**通过Spring接口的暴露,在实例化bean的阶段我们可以进行一些额外的处理,这些额外的处理只需要让bean实现对应的接口即可,那么spring就会在bean的生命周期调用我们实现的接口来处理该bean。[非常重要]

2.工厂方法

实现方式:

FactoryBean接口。

实现原理:

实现了FactoryBean接口的bean是一类叫做factory的bean。其特点是,spring会在使用getBean()调用获得该bean时,会自动调用该bean的getObject()方法,所以返回的不是factory这个bean,而是这个bean.getOjbect()方法的返回值。

例子:

典型的例子有spring与mybatis的结合。

代码示例:

说明:

我们看上面该bean,因为实现了FactoryBean接口,所以返回的不是 SqlSessionFactoryBean 的实例,而是它的 SqlSessionFactoryBean.getObject() 的返回值。

3.单例模式

Spring依赖

点击领取2024完整开源项目《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

注入Bean实例默认是单例的。

Spring的依赖注入(包括lazy-init方式)都是发生在AbstractBeanFactory的getBean里。getBean的doGetBean方法调用getSingleton进行bean的创建。

分析getSingleton()方法

public Object getSingleton(String beanName){
    //参数true设置标识允许早期依赖
    return getSingleton(beanName,true);
}
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
    //检查缓存中是否存在实例
    Object singletonObject = this.singletonObjects.get(beanName);
    if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
        //如果为空,则锁定全局变量并进行处理。
        synchronized (this.singletonObjects) {
            //如果此bean正在加载,则不处理
            singletonObject = this.earlySingletonObjects.get(beanName);
            if (singletonObject == null && allowEarlyReference) {  
                //当某些方法需要提前初始化的时候则会调用addSingleFactory 方法将对应的ObjectFactory初始化策略存储在singletonFactories
                ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
                if (singletonFactory != null) {
                    //调用预先设定的getObject方法
                    singletonObject = singletonFactory.getObject();
                    //记录在缓存中,earlysingletonObjects和singletonFactories互斥
                    this.earlySingletonObjects.put(beanName, singletonObject);
                    this.singletonFactories.remove(beanName);
                }
            }
        }
    }
    return (singletonObject != NULL_OBJECT ? singletonObject : null);
}

getSingleton()过程图

ps:spring依赖注入时,使用了 双重判断加锁 的单例模式

总结

**单例模式定义:**保证一个类仅有一个实例,并提供一个访问它的全局访问点。

**spring对单例的实现:**spring中的单例模式完成了后半句话,即提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是因为spring管理的是任意的java对象。

4.适配器模式

实现方式:

SpringMVC中的适配器HandlerAdatper。

实现原理:

HandlerAdatper根据Handler规则执行不同的Handler。

实现过程:

DispatcherServlet根据HandlerMapping返回的handler,向HandlerAdatper发起请求,处理Handler。

HandlerAdapter根据规则找到对应的Handler并让其执行,执行完毕后Handler会向HandlerAdapter返回一个ModelAndView,最后由HandlerAdapter向DispatchServelet返回一个ModelAndView。

实现意义:

HandlerAdatper使得Handler的扩展变得容易,只需要增加一个新的Handler和一个对应的HandlerAdapter即可。

因此Spring定义了一个适配接口,使得每一种Controller有一种对应的适配器实现类,让适配器代替controller执行相应的方法。这样在扩展Controller时,只需要增加一个适配器类就完成了SpringMVC的扩展了。

5.装饰器模式

实现方式:

Spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorator。

实质:

动态地给一个对象添加一些额外的职责。

就增加功能来说,Decorator模式相比生成子类更为灵活。

6.代理模式

实现方式:

AOP底层,就是动态代理模式的实现。

动态代理:

在内存中构建的,不需要手动编写代理类

静态代理:

需要手工编写代理类,代理类引用被代理对象。

实现原理:

切面在应用运行的时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象创建动态的创建一个代理对象。SpringAOP就是以这种方式织入切面的。

织入:把切面应用到目标对象并创建新的代理对象的过程。

7.观察者模式

实现方式:

spring的事件驱动模型使用的是 观察者模式 ,Spring中Observer模式常用的地方是listener的实现。

最后

现在其实从大厂招聘需求可见,在招聘要求上有高并发经验优先,包括很多朋友之前都是做传统行业或者外包项目,一直在小公司,技术搞的比较简单,没有怎么搞过分布式系统,但是现在互联网公司一般都是做分布式系统。

所以说,如果你想进大厂,想脱离传统行业,这些技术知识都是你必备的,下面自己手打了一份Java并发体系思维导图,希望对你有所帮助。

优先,包括很多朋友之前都是做传统行业或者外包项目,一直在小公司,技术搞的比较简单,没有怎么搞过分布式系统,但是现在互联网公司一般都是做分布式系统。

所以说,如果你想进大厂,想脱离传统行业,这些技术知识都是你必备的,下面自己手打了一份Java并发体系思维导图,希望对你有所帮助。

[外链图片转存中…(img-v9WbAHbZ-1709749743334)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_61067876/article/details/136521862

智能推荐

【三相旋转磁场】旋转磁场直到指定数量的周期(Matlab代码实现)-程序员宅基地

文章浏览阅读844次,点赞16次,收藏20次。【三相旋转磁场】研究涉及了对旋转磁场直到指定数量的周期的详尽探索,并且在研究过程中绘制了磁场随时间变化的图表。本文将深入探讨三相电机中磁场的旋转特性,包括磁场的形成过程、随时间的演变以及对电机性能的影响。通过对旋转磁场的系统分析,读者将能够更全面地理解三相电机工作原理,从而为电力系统和电机控制领域的进一步研究和应用提供坚实的理论基础。通常情况下,可以通过控制三个相位电流的频率和相位差来控制旋转磁场的速度和方向。要让这个磁场旋转到指定数量的周期,需要控制三个相位电流的频率和相位差。行百里者,半于九十。

大华工业相机SDK【QT+ C++】vs2015配置环境_c++调用华睿工业相机sdk-程序员宅基地

文章浏览阅读4.8k次,点赞3次,收藏34次。安装华睿相机的驱动:http://download.huaraytech.com/pub/sdk/Ver2.2.3/Windows/2.2.3版本里面增加QT调用的例程,很详细另有Document文件夹下的相关文件文档,配置可以进行参考本文对在调试需求下配置1、环境变量:自动安装的话,环境变量会自动添加,可以不动;2、3、解决方案,添加头文件和使用命名空间..._c++调用华睿工业相机sdk

java 库存 进销存 商户 多用户管理系统 SSM springmvc 项目源码-程序员宅基地

文章浏览阅读112次。统介绍:1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用)2.springmvc +spring4.3.7+ mybaits3.3 SSM 普通java web(非maven, 附赠pom.xml文件) 数据库:mysql3.开发工具:myeclipse eclipse idea 均可, 没有限制. 我这边myeclipse 2014 导出..._spring库存系统

基于微信小程序的自习室预约系统的设计与实现-程序员宅基地

文章浏览阅读1.6k次,点赞26次,收藏18次。伴随着信息技术与互联网技术的不断发展,校园也进到了一个新的信息化时代,传统管理技术性没法高效率、容易地管理自习室预约信息内容。为了实现时代的发展必须,提升自习室预约高效率,各种各样自习室预约体系应时而生,自习室预约管理系统的实现是信息内容时代浪潮时代的产物之一。一切系统都要遵循系统设计的基本流程。它还需要通过市场调查、需求分析报告、汇总设计、详尽设计以及测试,根据node语言表达设计,完成实验室预约管理系统。

2024年材料员-通用基础(材料员)证考试题库及材料员-通用基础(材料员)试题解析-程序员宅基地

文章浏览阅读320次,点赞9次,收藏5次。2024年材料员-通用基础(材料员)证考试题库及材料员-通用基础(材料员)试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作业人员上岗证考试大纲随机出的材料员-通用基础(材料员)在线模拟考试题练习。对此,正确的处理方式应当是( )。49、【单选题】按照标准制作方法制成边长为150mm的标准立方体试件,在标准条件(温度20℃±2℃,相对湿度为95%以上)下养护( ),然后采用标准试验方法测得的极限抗压强度值,称为混凝土的立方体抗压强度。安全 生产模 拟考试一点通。

ORA-12505, TNS:listener does not currently know of SID given in connect descriptor解决方法-程序员宅基地

文章浏览阅读6.3k次,点赞3次,收藏7次。报错原因:通过报错内容 “TNS:listener does not currently know of SID given in connect descriptor”,可以分析出,SID 不正确;jdbc连接数据库的时候,使用数据库的 sid_name,而不是数据库的 services_name(服务名)原文链接:https://blog.csdn.net/weixin_45894220/article/details/129839666。//监听sid服务,表示sid为orcl。_ora-12505

随便推点

DB2导入数据时乱码问题-程序员宅基地

文章浏览阅读2k次。1.由于导入import导入数据时乱码,一直找不到解决办法,于是就用load导入LOAD后,发现某些表检查挂起( 原因码为 "1",所以不允许操作 SQLSTATE=57016)解决办法:set integrity for xxxxxx immediate checked2.表锁定(原因码为7)解决办法:reorg table xxxx3.去重select di..._db2 export 默认编码

Java基础教程(3)-Java变量和数组-程序员宅基地

文章浏览阅读237次。定义一个整型变量num:num是标识符号,也叫变量名称,int是变量类型, 10是初始值可选变量分为两种:基本类型的变量和引用类型的变量。在Java中,所有的变量必须先声明再使用。基本的变量声明方法如下:type是Java的基本类型之一,或类及接口类型的名字。标识符(identifier)是变量的名字,指定一个等号和一个值来初始化变量。请记住初始化表达式必须产生与指定的变量类型一样(或兼容)的变量。声明指定类型的多个变量时,使用逗号将各变量分开;

yarn 安装依赖报错 error An unexpected error occurred: https://registry.yarnpkg.com“-程序员宅基地

文章浏览阅读4.1k次,点赞3次,收藏4次。yarn 安装依赖报错 error An unexpected error occurred: https://registry.yarnpkg.com“

IDEA怎么快速注释多行_idea多行注释-程序员宅基地

文章浏览阅读1.2k次。二、文档注释:输入/**后,按Enter,会自动根据参数和返回值生成注释模板。2.多行注释:Ctrl +Shift+ /一、选中内容然后按需要按快捷键。1.单行注释:Ctrl + /_idea多行注释

蝴蝶飞舞-程序员宅基地

文章浏览阅读894次。 这个哥们儿的手指蛮灵活啊,他好像叫balian fabisonghttp://www.videoplayer.es/video/indexthumbs-instructional-balisong-trick-trip-hop-beat/tVAJDI5dRFs/http://www.youtube.com/watch?v=o8_KlXPGHW8http://www.youtube.c

Grafana 提醒注意严重的认证绕过漏洞-程序员宅基地

文章浏览阅读928次。聚焦源代码安全,网罗国内外最新资讯!编译:代码卫士Grafana 为其多个应用版本发布安全修复方案,修复了一个严重漏洞,它可使攻击者绕过认证并接管使用 Azure Active Directory 用于认证的任何 Grafana 账户。该漏洞的编号是CVE-2023-3128,CVSS v3.1评分是9.4。Grafana 是一款广泛使用的开源分析和交互可视化 app,通过大量监控平台和应用程序..._grafana6.7.6版本漏洞