1、@Autowired与@Resource异同
(1)@Autowired与@Resource都可以用来装配bean。都可以写在字段上,或写在setter方法上。
(2)@Autowired默认按类型装配(属于spring规范),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false),如果我们想使用名称装配可以结合@Qualifier注解进行使用。
(3)@Resource(属于J2EE返回),默认按照名称进行装配,名称可以通过name属性进行指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
(4)@Autowired与@Resource的作用相同都是用注解方式注入对象,但执行顺序不同。@Autowired先byType,@Resource先byName。
2、I/O复用模型及I/O多路复用
此模型用到select和poll函数,这两个函数也会使进程阻塞,select先阻塞,有活动套接字才返回,但是和阻塞I/O不同的是,这两个函数可以同时阻塞多个I/O操作,而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写(就是监听多个socket)。select被调用后,进程会被阻塞,内核监视所有select负责的socket,当有任何一个socket的数据准备好了,select就会返回套接字可读,我们就可以调用recvfrom处理数据。 正因为阻塞I/O只能阻塞一个I/O操作,而I/O复用模型能够阻塞多个I/O操作,所以才叫做多路复用。
3、final关键字解析
(1)被final修饰的类不可被继承。
(2)被final修饰的方法不可被重写。
(3)被final修饰的变量不可被改变(切记不可变的是变量的引用而非引用指向对象的内容)。
(4)被final修饰的方法,JVM会尝试为之寻求内联,这对于提升Java的效率是非常重要的。因此,假如能确定方法不会被继承,那么尽量将方法定义为final的,具体参见运行期优化技术的方法内联部分。
(5)被final修饰的常量,在编译阶段会存入调用类的常量池中,具体参见类加载机制最后部分和Java内存区域。
4、public、private、protect、default分析
public
Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。
private
Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。
protect
介于public和private之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
default
即不加任何访问修饰符,通常称为“默认访问模式"。该模式下,只允许在同一个包中进行访问。
5、深拷贝和浅拷贝区别
浅拷贝(shallow Copy)
对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,不会影响另一个对象拷贝得到的数据。②对于数据类型是引用数据类型的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。因为实际上两个对象的该成员变量都指向同一个实例。在这种情况下,在一个对象中修改该成员变量会影响到另一个对象的该成员变量值。
深拷贝(deep Copy)
首先介绍对象图的概念。设想一下,一个类有一个对象,其成员变量中又有一个对象,该对象指向另一个对象,另一个对象又指向另一个对象,直到一个确定的实例。这就形成了对象图。那么,对于深拷贝来说,不仅要复制对象的所有基本数据类型的成员变量值,还要为所有引用数据类型的成员变量申请存储空间,并复制每个引用数据类型成员变量所引用的对象,直到该对象可达的所有对象。也就是说,对象进行深拷贝要对整个对象图进行拷贝! 简单地说,深拷贝对引用数据类型的成员变量的对象图中所有的对象都开辟了内存空间;而浅拷贝只是传递地址指向,新的对象并没有对引用数据类型创建内存空间。
6、Mybatis延迟加载的基本原理
Mybatis 仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载。
lazyLoadingEnabled=truelfalse。
它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。
不仅Mybatis,几乎所有的包括Hibernate,支持延迟加载的原理都是一样的。
7、RabbitMQ 有哪些重要的组件?
ConnectionFactory(连接管理器)
应用程序与Rabbit之间建立连接的管理器,程序代码中使用。
Channel(信道)
消息推送使用的通道。
Exchange(交换器)
用于接受、分配消息。
Queue(队列)
用于存储生产者的消息。
RoutingKey(路由键)
用于把生成者的数据分配到交换器上。
BindingKey(绑定键)
用于把交换器的消息绑定到队列上。
8、Spring中运用了哪些设计模式?
工厂模式
Spring使用工厂模式通过BeanFactory、ApplicationContext 创建bean对象。
代理模式
Spring AOP功能的实现。
单例模式
Spring中的Bean默认都是单例的。
模板方法模式
Spring中jdbcTemplate、hibernate Template 等以Template结尾的对数据库操作的类,它们就使用到了模板模式。
包装器设计模式
我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
观察者模式
Spring 事件驱动模型就是观察者模式很经典的一个应用。
适配器模式
Spring AOP的增强或通知(Advice)使用到了适配器模式、springMVC中也是用到了适配器模式适配Controller。
9、Redis的八种数据类型
Redis 支持五种数据类型:
string(字符串)
hash(哈希)
list(列表)
set(集合)
zset(sorted set)(有序集合)。
我们实际项目中比较常用的是string,hash。
如果你是Redis中高级用户,还需要加上下面几种数据结构 HyperLogLog、Geo、Pub/Sub。 Redis Module,像BloomFilter,RedisSearch,Redis-ML。