《面试题》2、Java基础框架

2.1 Spring/Springboot/SpringMVC

1、@Autowired和@Resouce区别

- @Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用;
- @Resource(这个注解属于J2EE的),默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配;

例如:RedisTemplate双亲委派出现的问题

2、Springboot的starter原理

原理:利用starter实现自动化配置只需要两个条件——maven依赖、配置文件,这里简单介绍下starter实现自动化配置的流程。
引入maven实质上就是导入jar包,spring-boot启动的时候会找到starter jar包中的resources/META-INF/spring.factories文件,根据spring.factories文件中的配置,找到需要自动配置的类。
    - 配置如下:
        org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
        com.ouyanglol.starterdemo.config.DemoAutoConfiguration
    - 用到的注解:
        @Configuration	表明是一个配置文件,被注解的类将成为一个bean配置类
        @ConditionalOnClass	当classpath下发现该类的情况下进行自动配置
        @ConditionalOnBean	当classpath下发现该类的情况下进行自动配置
        @EnableConfigurationProperties	使@ConfigurationProperties注解生效
        @AutoConfigureAfter	完成自动配置后实例化这个bean
参考博客:https://blog.csdn.net/Mr_OOO/article/details/89477948

2.2 Mybatis

1、Mybatis #和$的区别?

#:参数注入,不会有sql注入问题,底层源码是jdbc的param api
$: 字符串替换,会有sql注入的危险

2、Mybatis 的一级缓存和二级缓存的作用?

一级缓存 session 
二级缓存 Mapper 会有数据延时问题

2.3 Netty

1、BIO、NIO、AIO是什么,区别,适用场景?

1.概念:
- BIO:同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
- NIO:同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
- AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理
        
2.适用场景:
- BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
- NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
- AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

2、Netty是什么?实现原理是?核心组件?优缺点?

1.是什么?
- Netty是⼀个基于NIO的client-server(客户端服务器)框架,使⽤它可以快速简单地开发⽹络应⽤程序。它极⼤地简化并优化了TCP和UDP套接字服务器等⽹络编程,并且性能以及安全性等很多⽅⾯甚⾄都要更好。⽀持多种协议 如FTP,SMTP,HTTP 以及各种⼆进制和基于⽂本的传统协议。
- 很多开源项⽬⽐如我们常⽤的Dubbo、RocketMQ、Elasticsearch、gRPC等等都⽤到了Netty。

2.核心组件
1.Channel
    - Channel 接⼝是 Netty 对⽹络操作抽象类,它除了包括基本的 I/O 操作,如bind() 、 connect() 、 read() 、 write() 等。
    - 常⽤的 Channel 接⼝实现类是 NioServerSocketChannel (服务端)和 NioSocketChannel (客户端),这两个 Channel 可以和 BIO 编程模型中的 ServerSocket 以及 Socket 两个概念对应上。

2.EventLoop(事件循环)
    - EventLoop 定义了Netty的核⼼抽象,⽤于处理连接的⽣命周期中所发⽣的事件。说⽩了,EventLoop的主要作⽤实际就是负责监听⽹络事件并调⽤事件处理器进⾏相关 I/O 操作的处理。
    - Channel 和 EventLoop 直接有啥联系呢?
        Channel 为 Netty ⽹络操作(读写等操作)抽象类, EventLoop 负责处理注册到其上的 Channel处理 I/O 操作,两者配合参与 I/O 操作。
    
3.ChannelFuture
Netty 是异步⾮阻塞的,所有的 I/O 操作都为异步的。
因此,我们不能⽴刻得到操作是否执⾏成功,但是,你可以通过 ChannelFuture 接⼝的addListener()⽅法注册⼀个ChannelFutureListener,当操作执⾏成功或者失败时,监听就会⾃动触发返回结果。并且,你还可以通过 ChannelFuture 的 channel() ⽅法获取关联的 Channel。另外,我们还可以通过 ChannelFuture 接⼝的 sync() ⽅法让异步的操作变成同步的。

4.ChannelHandler 和 ChannelPipeline
- ChannelHandler 是消息的具体处理器。他负责处理读写操作、客户端连接等事情。
- ChannelPipeline 为 ChannelHandler 的链,提供了⼀个容器并定义了⽤于沿着链传播⼊站和出站
事件流的 API 。当 Channel 被创建时,它会被⾃动地分配到它专属的 ChannelPipeline 。
- 我们可以在 ChannelPipeline上通过addLast()⽅法添加⼀个或者多个ChannelHandler ,因为⼀个数据或者事件可能会被多个Handler处理。当⼀个ChannelHandler处理完之后就将数据交给下⼀个 ChannelHandler 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值