5/28 面试复盘

本文总结了Spring Boot基础注解应用、equals与==的区别、用户注册方法、MVC流程、Service注解、线程池创建、哈希map比较、设计模式与Linux命令,以及懒汉和饿汉单例模式的深入解析。
摘要由CSDN通过智能技术生成

5/28 面试复盘

  1. Spring Boot 基础注解 @springbootapplication 怎么实现的

    springbootapplication 组合了@SpringBootConfiguration、@EnableAutoConfiguration以及@ComponentScan,

    @SpringBootConfiguration表明这个类是一个配置类,pring容器会在这里寻找bean配置初始化的参数

    @EnableAutoConfiguration则表示让Spring Boot根据类路径中的jar包依赖为当前项目进行自动配置,自动配置

    @ComponentScan的可以配置注解扫描的包

    ompentscan注解就是之前ssm注解配置的<context:sacn />标签

    springbootconfiguration注解,其实可以说就是spring声明配置类的configuration注解

  2. Equals 和 == 的区别

    ==比较符比较的是其引用地址,使用equals大都是比较的其内容

    equals 比较流程

    • 是否同一对象

      • 是否是一个字符串类型的对象
      • 比较长度
      • 拆分成char数组
      • 比较char
  3. 如何实现用户名的注册和等录

    加盐 md5加密 存放盐和加密结论 取盐 加密传输后对比数据库结论

  4. mvc的流程

    MVC是Model-View-Controller的简写。“Model” 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), “View” 是应用的表示面(由JSP页面产生),“Controller” 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。

    1.用户发送请求至前端控制器DispatcherServlet
    2.DispatcherServlet收到请求调用处理器映射器HandlerMapping
    3.处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet。
    4.DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作
    5.执行处理器Handler(Controller,也叫页面控制器)。
    6.Handler执行完成返回ModelAndView
    7.HandlerAdapter将Handler执行结果ModelAndView返回到DispatcherServlet
    8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器
    9.ViewReslover解析后返回具体View
    10.DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中)。
    11.DispatcherServlet响应用户。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XS9fIyG6-1635328418689)(C:\Users\l\AppData\Roaming\Typora\typora-user-images\image-20210531160412422.png)]

  5. Service层用什么注解,

    2、数据库表格对应的实体类及json封装的实体类的搭建(entities)
    3、数据交互层的搭建(Dao)@Data@Mapper
    4、业务逻辑层的搭建(service)@Service
    5、表现层的搭建(controller)@Controller @RestController

  6. 线程池的创建

    newCachedThreadPool创建可缓存线程池、

    newFixedThreadPool创建定长线程池、

    newScheduledThreadPool创建定长线程池、

    newSingleThreadExecutor创建单线程化线程池。

  7. hashmap 和linkedhashmap 的区别

    hash值做下表 查询快 插入相对慢一些

    linkedhashmap 有序 插入快

  8. 第三方工具

    阿帕奇的comment 包

    hutool 用于日期 bean管理 等等 MD5加密

  9. 反射的实现

    classforname()

    .getClass().getClassLoader()获取ClassLoader对象,然后通过.getClass().getInterfaces()获取它实现的所有接口,

  10. IOC AOP

    依赖注入 配置文件写bean autowired自动加载

    • Aspect(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
    • Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
    • Pointcut(切点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
    • Advice(增强):Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
    • Target(目标对象):织入 Advice 的目标对象.。
    • Weaving(织入):将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程
  11. 单例模式 懒汉和饿汉

    单例模式是一种常用的软件设计模式,其定义是

    单例对象的类只能允许一个实例存在。

    许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

    单例的实现主要是通过以下两个步骤

    1. 将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例;
    2. 在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。

    懒汉模式:

    优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。

    缺点:在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费。

    饿汉模式:

    延迟加载,即只有在真正使用的时候才会实例化一个对象并交给自己的引用。

    这种写法起到了Lazy Loading的效果,但是只能在单线程下使用。如果在多线程下,一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。所以在多线程环境下不可使用这种方式。

  12. 分表主键区分问题

    uuid 号段模式 雪花算法:时间戳+工作机器+序列号 Leaf

  13. 设计模式

  14. linux命令

    ps 查看系统进程线程

    pstree 查看系统进程树

    top 查看系统进程线程运行情况

    tail 命令可用于查看文件的内容

    free 查看内存及使用情况

    pwd(英文全拼:print work directory) 命令用于显示工作目录。

    cat 查看配置文件,或者是日志文件

    sort 对标准内容做排序

    df 查看磁盘大小和占用情况

    find 查找文件

    ping

    telnet

    nc netcat,可以用来看远程某个端口是否打开

    netstat 查看本机的网络状态

    curl 发起一个http请求,我一般都是用这个命令来验证服务是否能正常访问的

    dig 查看域名的信息

    yum|apt install

    wget

  15. 动态代理和静态代

代理:给其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。

静态:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。代码重复、加一个处理就要添加一个代码。静态代理类只能为特定的接口(Service)服务。如想要为多个接口服务则需要建立很多个代理类。

动态:在程序运行时运用反射机制动态创建而成。AOP的实现

我们通过.getClass().getClassLoader()获取ClassLoader对象,然后通过.getClass().getInterfaces()获取它实现的所有接口,然后将targetObject包装到实现了InvocationHandler接口的LogHandler对象中。通过newProxyInstance函数我们就获得了一个动态代理对象。

我们可以通过LogHandler代理不同类型的对象,如果我们把对外的接口都通过动态代理来实现,那么所有的函数调用最终都会经过invoke函数的转发,因此我们就可以在这里做一些自己想做的操作,比如日志系统、事务、拦截器、权限控制等。这也就是AOP(面向切面编程)的基本原理。

最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理(InvocationHandler.invoke)。这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。而且动态代理的应用使我们的类职责更加单一,复用性更强

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值