Spring 常问面试题

什么是Spring?

Spring是一个轻量级Java开发框架,是由Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。是一个分层的JavaSE/JavaEE full-stack(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。Spring负责基础架构,因此Java开发者可以专注于应用程序的开发。
Spring最根本的使命是解决企业级应用开发的复杂性,简化Java开发。

Spring框架中都用到了哪些设计模式?

  • 工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
  • 单例模式:Bean默认为单例模式;
  • 代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
  • 模板方法:用来解决代码重复的问题,比如RestTemplate、JmsTemplate、JpaTemplate
  • 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变的时候,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现(ApplicationListener)

Spring框架中有哪些不同类型的事件?

  • 上下文更新事件(ContextRefreshedEvent):在调用ConfigurableApplicationContext接口中的refresh()方法时被触发;
  • 上下文开始事件(ContextStartedEvent):在容器调用ConfigurableApplicationContext接口中的start()方法开始、重新开始容器时时被触发;
  • 上下文停止事件(ContextStoppedEvent):当容器调用ConfigurableApplicationContext接口中的Stop()方法停止容器时触发该事件;
  • 上下文关闭事件(ContextClosedEvent):当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都会被销毁。
  • 请求处理事件(RequestHandledEvent):在Web应用中,当一个http请求(request)结束触发该事件,如果一个bean实现了ApplicationListener接口,当一个ApplciationEvent被发布以后,bean会自动被通知。

什么是Spring IOC容器?

控制反转即IOC(Inversion Of Control),它把传统由程序代码直接操控的对象的调用权利交给了Spring容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象的控制权的转移,从程序代码本身转移到了外部容器。
Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的生命周期)。

控制反转(IOC)的作用?

  • 管理对象的创建和依赖关系的维护。 对象的创建并不是一件简单的事情,在对象关闭比较复杂的时候,如果依赖关系需要程序员来维护,是相当繁琐和复杂的;
  • 解耦合,由容器去维护具体的对象;
  • 托管了类的产生过程,比如我们需要在类的产生过程中做一些处理,最直接的例子就是代理,如果有容器程序可以把这部分处理交给容器,应用程序则无需关心类是如何完成代理的;

Spring IOC的实现机制,支持功能?

Spring中 IOC的实现原理就是工厂模式加反射机制。
Spring IOC设计支持以下功能:

  • 依赖注入
  • 依赖检查
  • 自动装配
  • 支持集合
  • 指定初始化方法
  • 销毁方法
  • 支持回调某些方法(但是需要实现Spring接口)

BeanFactory和ApplicationContext有什么区别?

BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做是Spring的容器,其中ApplicationContext是BeanFactory的子接口。

  • 依赖关系
    BeanFactory:是Spring里面最底层的接口,包含了各种的Bean的定义,读取bean的配置文档,管理bean的加载,bean的实例化,控制bean的生命周期,维护bean之间的依赖关系。
    ApplicationContext接口作为BeanFactory的派生,提供了BeanFactory所具有的功能外,还提供了更加完整地框架功能:
    • 继承MessageSource,支持国际化,统一的资源文件访问方式;
    • 提供在监听器中注册bean的事件;
    • 同时加载多个配置文件;
    • 载入多个(有继承关系)上下文,使得每一个上下文都专注于一个特定的层次,比如应用的web层;
  • 加载方式
    BeanFactory采用的是延迟加载形式来注入Bean,即只有在使用到某个Bean的时候(调用getBean()),才会对Bean进行加载实例化,这样我们不能发现一下存在的Spring配置问题。
    如果Bean的某一个属性没有注入,BeanFactory加载后,直至第一次调用getBean方法才回抛出异常。
    ApplicationContext,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring存在的配置错误,这样有利于检查所依赖属性是否注入。
    ApplicationContext启动后预加载所有的单实例Bean,通过预加载单实例Bean确保需要的时候,不用等待,因为已经创建好了。
    相对于基本的BeanFactory,ApplicationContext唯一的不足就是占用内存空间,当应用程序配置Bean较多时,程序启动较慢。
  • 创建方式
    BeanFactory通常以编程的方式被创建,ApplicationContext还能以声明的方式创建,如使用ContextLoader。
  • 注册方式
    BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但是两者的区别是:
    BeanFactory需要手动注册,ApplicationContext则是自动注册。

什么是Spring的依赖注入?

控制反转IOC是一个很大的概念,可以用不同的方式来实现,主要实现的方式有:

  • 依赖注入
    • 接口注入
    • Setter方法注入
    • 构造器注入
  • 依赖查找注入

Spring面向切面编程?

AOP(Aspect-Oriented-Programming),一般称为面向切面编程,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”,减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性,可用于权限认证、日志、事务处理等。

Spring AOP和AspectJ AOP有什么区别?

AOP实现的关键在于代理模式,AOP代理主要分为静态代理和动态代理,静态代理的代表是AspectJ;动态代理则是以Spring AOP为代表。

  • AspectJ是静态代理的增强,所谓静态代理,就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强,他会在编译阶段将AspectJ(切面)织入到Java字节码中,运行的时候就是增强之后的AOP对象。
  • Spring AOP 使用的是动态代理,所谓的动态代理就是AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标方法的所有方法,并且在特定的切点做了增强处理,并回调原对象的方法。

JDK动态代理和CGLIB动态代理的区别?

Spring AOP中的动态代理有两种,JDK动态代理和CGLIB动态代理。

  • JDK动态代理只提供接口的代理,不支持类的代理。核心InvocationHandler接口和Proxy类,InvocationHandler通过invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起,接着Proxy利用InvocationHandler动态创建一个符合某一接口的实例,生成目标类的代理对象。
  • 如果代理类没有实现 InvocationHandler 接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个小坑货

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值