《春天18卷《面试八股文》新鲜出炉。这次整理了一下spring的面试题。当然,这里可能会有一些过于基础的概念。我直接把他们归类到某个问题,并没有单独开一个问题。祝面试顺利~1.spring用到的设计模式有哪些?《1.工厂设计模式》:比如通过BeanFactory和ApplicationContext生产Bean对象《2.代理设计模式》:AOP通过代理实现,Spring主要使用JDK动态代理和CGLIB代理《3.单例设计模式》:Spring中的Bean默认都是单例《4.模板方法模式》:在Spring中jdbcTemplate等以Template结尾的类进行数据库操作都会使用模板方法设计模式,一些通用的功能《5.Wrapper设计模式》:我们的项目需要连接多个数据库,不同的客户在每次访问时会根据需要访问不同的数据库。这种模式可以让我们根据客户需求动态切换不同的数据源《6.观察者模式》:Spring事件驱动模型的《7.适配器模式》观察者模式:SpringAOP增强或者通知(Advice)使用时说到adapter模式2.spring的核心模块有哪些?1.《SpringCore》:Spring核心,是框架最基础的部分,提供IOC和依赖注入DI特性2.《SpringContext》:Spring上下文容器,是BeanFactory增强的子接口3.》SpringWeb”:为Web应用开发提供支持4.“SpringMVC”:针对MVC思想在Web应用中的实现5.“SpringDAO”:为JDBC提供抽象层,简化JDBC编码,并在同时,编码更健壮6.《SpringORM》:支持流行的ORM框架集成,如:Spring+Hibernate、Spring+iBatis、Spring+JDO集成等7.《SpringAOP》:即就是,面向切面编程,它提供了一个兼容AOPAlliance的编程实现3.说说你了解的IOC?首先,IOC是一个用来装载对象的“容器”。它的核心思想是“控制反转”那么“控制反转”到底是什么?InversionofControl就是说,“把对象的控制权交给spring,由spring容器管理”,我们不做任何操作,那么为什么“为什么需要InversionofControl呢?”转”?我们试想一下,在没有控制反转的情况下,我们需要“自己创建对象,自己配置对象”,“手动处理对象之间各种复杂的依赖关系”。经过测算,这种关系的维护非常麻烦,于是就有了控制反转的概念,对象的创建、配置等一系列操作都交给spring来管理,我们使用的时候只需要fetch即可。四、什么是IOC容器在spring中?有什么不同呢?spring主要提供了“两个IOC容器”,一个是“BeanFactory”,一个是“ApplicationContext”。它们之间的区别在于,“BeanFactory”只提供了最基本的对象实例化和获取功能objects”,而ApplicationContext是BeanFactory的派生产物,是BeanFactory的子类,功能更强大,比如支持注解注入,国际化等功能5、BeanFactory和FactoryBean有什么区别?这两个是“不同的产物”“BeanFactory是一个IOC容器”,用来承载对象“FactoryBean是一个接口”,为Bean6提供了更多的灵活性。@Repository、@Service、@Compent、和@控制器?“这四个注解的本质是一样的,都是将使用该注解标识的对象放入spring 容器中,只是为了区分不同的应用层在使用中。”@Repository:dao层@Service:service层@Controller:controller层@Compent:其他不属于以上三层的统一使用这个注解7.那么DI是什么?DI即dependencyinjection,大致相同IOC,除了“同一个概念,从不同的角度解释。”DI描述的是“重点在于依赖”,我们说“IOC的核心功能是在程序运行时,动态地向一个对象提供其他依赖对象”running”,而这个功能是由DI来完成的。比如我们需要注入一个对象A,而这个对象A又依赖于一个对象B,那么我们就需要将这个对象B注入到对象A中,这就是依赖注入。在spring,有三种注入方式:接口注入、构造函数注入、集合注入八、什么是AOP?AOP的意思是:“面向切面编程,一种在运行时通过预编译和动态代理实现程序功能统一维护的技术。“AOP是”协OOP(面向对象编程)的延续”,是Spring框架中的重要内容,是函数式编程的衍生范式。AOP可以用来隔离业务逻辑的各个部分,从而降低业务逻辑各个部分之间的耦合度,提高程序的复用性,同时提高开发效率。《AOP实现主要分为两类:》《静态AOP实现》,AOP框架在“编译阶段”修改程序源码,生成静态AOP代理类(生成的*.class文件有改动,需要使用特定的编译器),比如AspectJ的“动态AOP实现”,AOP框架“在运行阶段”动态生成代理对象(在内存中用JDK动态代理,或者CGlib动态生成AOP代理类),比如SpringAOPspring的实现AOP的实现方式是“通过动态代理实现”。如果实现接口,则使用JDK动态代理,否则使用CGLIB代理。"有5种通知类型:""@Before":在目标方法调用前通知"@AfterReturning":在目标方法返回或异常后调用"@AfterThrowing":在目标方法返回后调用"@after”:在目标方法异常后调用“@Around”:封装目标方法,调用时机自行决定9、动态代理和静态代理有什么区别?它编译。在程序运行之前,代理类的.class文件已经存在。静态代理通常只代理一个类。静态代理预先知道要代理什么。“动态代理”。在一个接口下代理多个实现类动态代理不知道代理什么,只在运行时十。JDK动态代理和CGLIB代理有什么区别?JDK动态代理业务类“必须实现某个接口”,即“基于反射机制实现”,生成一个实现相同接口的代理类,然后通过重写方法来增强代码。CGLIB动态代理使用字节码处理框架ASM。它的原理是通过字节码技术“为一个类创建一个子类,然后重写父类的方法”来增强代码。十一。SpringAOP和AspectJAOP有什么区别?SpringAOP是一种运行时增强,是通过“动态代理”实现的。AspectJAOP是编译时增强,需要专门的编译器来完成,通过“修改代码”实现,支持“三种编织方式”“编译时编织”:编译字节码时编织相关代理类“之后编织”compiling”:编译初始类后,发现需要AOP增强,然后weaving进入相关代码“weavingwhenclassloading”:指的是在加载器加载类时进行织入12.什么是类的生命周期春天的豆子?SpringBean生命周期大致分为4个阶段:1.“实例化”,实例化Bean对象2.“填充属性”,给Bean赋值3.“初始化”如果实现了Aware接口,容器资源将通过其接口获取如果实现了BeanPostProcessor接口,则接口的前置和Post-processing增强如果配置了init-method方法,则执行该方法4.“Destroy”如果实现了DisposableBean接口,则调用DisposableBean接口的destroy方法接口会被回调如果配置了destroy-method方法,就会执行destroy-method配置方法13.spring如何解决循环依赖?循环依赖是指两个对象相互依赖,形成循环调用链接。Spring使用三级缓存来解决循环依赖。将实例化和初始化的步骤分开,然后放入缓存”,对于另一个对象调用“一级缓存”:用于保存已经实例化和初始化的对象,但未初始化的对象“三级缓存”:用于保存一个对象工厂,并提供一个匿名内部类,用于在二级缓存中创建对象当类A和B之间发生循环引用时,一般流程1.A实例化后,进入“创建对象工厂并放入”它在三级缓存中。如果A被AOP代理,那么通过这个工厂得到的对象就是A代理后的对象。工厂得到的是A实例化的对象2.A进行属性注入时,去“创建B”3.B进行属性注入,如果需要A,则“从三级缓存中获取A工厂代理对象”并注入,然后删除三级缓存中的A工厂,将A放入对象进入二级缓存4.B完成后续属性注入,直到初始化完成,将B放入一级缓存5.“A从一级缓存中取出B,注入B”,直到后续操作完成,从二级缓存中删除A并放入一级缓存,循环依赖结束spring解决循环依赖有两个前提条件:1.循环依赖即“不是所有构造函数”(否则初始化和实例化的操作不能分开)2.“必须是单例”(否则不能保证是同一个对象)十四.为什么要用三级缓存,二级缓存解决不了?是的,三级缓存的作用是只有在真正发生循环依赖时才提前生成代理对象,否则只会“创建一个工厂,放入三级缓存”,但不会通过这个工厂实际创建对象。如果使用二级缓存来解决循环依赖,意味着所有的bean在实例化后都会完成AOP代理,这“违反了Spring的设计原则”,Spring的设计初衷是在Bean的最后一步完成AOP代理生命周期,而不是在实例化后立即执行AOP代理。15.@Autowired和@Resource有什么区别?“@Resource是Java自带的注解”,@Resource有两个比较重要的属性,分别是name和type;Spring将@Resource注解的name属性解析为bean的名称,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,使用type属性时,使用byType的自动注入策略。如果既没有指定name也没有指定type属性,则会通过反射机制使用byName自动注入策略。“@Autowired是spring的一个注解”,在spring2.5版本中引入。Autowired仅根据类型注入,“它不会匹配名称”。如果类型不能区分注入的对象,需要用@Qualifier或@Primary注解进行修饰。十六。spring的事务隔离级别是多少?DEFAULT:采用DB默认的事务隔离级别READ_UNCOMMITTED:读未提交READ_COMMITTED:读已提交REPEATABLE_READ:可重复读SERIALIZABLE:连载十七。spring事务的传播机制是什么?1."propagation_required"当前方法“必须在有事务的上下文中运行”,如果客户端有事务在进行,那么被调用端会在事务中运行,否则重启一个事务。(如果被调用端发生异常,调用端和被调用端事务都会被回滚)2."propagation_supports"当前方法不需要有事务上下文,但是如果有事务,可以也在这个事务中运行3."propagation_mandatory"表示当前方法"必须在一个事务中运行",如果没有事务,会抛出异常4."propagation_nested"如果当前方法有事务运行,则该方法应该”运行在一个嵌套的嵌套事务中,嵌套事务可以独立于封装的事务提交或回滚。如果封装的事务存在并且外层事务抛出异常回滚,那么内层事务必须回滚,否则,内层事务不影响外层事务,如果封装的事务不存在,则同propagation_required5."propagation_never"当前方法不应该在事务中运行,如果“事务存在,则抛出异常”6.“propagation_requires_new”当前方法“必须在自己的业务中运行”。将启动一个新的事务,如果有一个现有的事务正在运行,则该方法将在运行时挂起,直到新的事务提交或回滚后才继续执行。7.“propagation_not_supported”方法不应在事务中运行。“如果一个事务正在运行,它将在运行期间被挂起,直到事务被提交或回滚。”18.SpringBoot自动组装原理?1、容器启动时会调用EnableAutoConfigurationImportSelector.class的selectImports方法“获取常用BeanConfiguration的综合列表”2、之后会读取spring-boot-autoconfigure.jar下的spring.factories,“获取完整的BeanConfiguration所有Spring相关bean的限定名ClassName”3.然后继续“调用filter逐一过滤”,过滤掉一些我们不需要的不合格Bean4.最后将符合条件的BeanConfiguration注入到默认的EnableConfigurationPropertie类中的属性值中,“注入IOC环境”
