1.简述一下Spring的AOP和IOC
Spring通知(Advice)有哪些类型?
Spring框架中的Bean是线程安全的么?如果线程不安全,那么如何处理?
那么解释Java堆空间及GC?
内存模型以及分区,需要详细到每个区放什么。
堆里面的分区:Eden,survival(from+to),老年代,各自的特点。
GC的两种判定方法
消息队列有什么优缺点?
RabbitMQ的高可用性如何保证?
面试部分
开场依旧是简单的,介绍在介绍中他提到了一些擅长的技术Spring和JVM以及MQ,所以我的问题也是偏向他擅长的部分。(PS:所以大家在面试的时候自我介绍介绍点自己擅长的部分会给自己后面的面试带来很大的优势哦)
我:刚才在你的自我介绍的简述一下Spring的AOP和IOC么?
答:
首先IOC部分:
IOC就是控制反转,指创建对象的控制权转移给Spring框架进行管理,并由Spring根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。DI依赖注入,和控制反转是同一个概念的不同角度的描述,即应用程序在运行时依赖IoC容器来动态注入对象需要的外部依赖。
最直观的表达就是,以前创建对象的主动权和时机都是由自己把控的,IOC让对象的创建不用去new了,可以由Spring自动生产,使用java的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方法的。
Spring的IOC有三种注入方式:构造器注入、setter方法注入、根据注解注入。
然后是AOP部分:
AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,提高系统的可维护性。可用于权限认证、日志、事务处理。
AOP实现的关键在于代理模式,AOP代理主要分为静态代理和动态代理。静态代理的代表为AspectJ;动态代理则以SpringAOP为代表。
我:既然提到了AspectJ那么稍微说下吧。
答:
AspectJ是静态代理,也称为编译时增强,AOP框架会在编译阶段生成AOP代理类,并将AspectJ(切面)织入到Java字节码中,运行的时候就是增强之后的AOP对象。
我:Spring通知(Advice)有哪些类型?
答:
一般有5种
前置通知(BeforeAdvice):在连接点(Joinpoint)之前执行的通知。
后置通知(After Advice):当连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
环绕通知(AroundAdvice):包围一个连接点的通知,这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也可以选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。
返回后通知(AfterReturningAdvice):在连接点正常完成后执行的通知(如果连接点抛出异常,则不执行)
抛出异常后通知(AfterThrowingadvice):在方法抛出异常退出时执行的通知
我:Spring框架中的Bean是线程安全的么?如果线程不安全,那么如何处理?
答:
Spring容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体情况还是要结合Bean的作用域来讨论。
(1)对于prototype作用域的Bean,每次都创建一个新对象,也就是线程之间不存在Bean共享,因此不会有线程安全问题。
(2)对于singleton作用域的Bean,所有的线程都共享一个单例实例的Bean,因此是存在线程安全问题的。但是如果单例Bean是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例Bean是线程安全的。比如Controller类、Service类和Dao等,这些Bean大多是无状态的,只关注于方法本身。
有状态Bean(StatefulBean):就是有实例变量的对象,可以保存数据,是非线程安全的。
无状态Bean(StatelessBean):就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的。
对于有状态的bean(比如Model和View),就需要自行保证线程安全,最浅显的解决办法就是将有状态的bean的作用域由“singleton”改为“prototype”。
也可以采用ThreadLocal解决线程安全问题,为每个线程提供一个独立的变量副本,不同线程只操作自己线程的副本变量。
ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。同步机制采用了“时间换空间”的方式,仅提供一份变量,不同的线程在访问前需要获取锁,没获得锁的线程则需要排队。而ThreadLocal采用了“空间换时间”的方式。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。
Spring,rabbitMq面试题及答案
最新推荐文章于 2024-06-03 16:20:50 发布