Spring面试题

1、:什么是Spring?

Spring是Enterprise Java的开源开发框架。Spring Framework的核心功能可用于开发任何Java应用程序,但有一些扩展用于在Java EE平台之上构建Web应用程序。Spring框架的目标是通过启用基于POJO的编程模型,使Java EE开发更易于使用并促进良好的编程实践。

2、:Spring Framework有哪些优点?

轻巧:Spring在尺寸和透明度方面都很轻巧。spring框架的基本版本大约为2MB。

 控制反转(IOC): 使用反转控制技术在Spring中实现松耦合。对象提供依赖关系,而不是创建或查找依赖对象。 

面向方面(AOP): Spring支持面向方面的编程,并将应用程序业务逻辑与系统服务分开。 

容器: Spring包含并管理应用程序对象的生命周期和配置。

MVC框架: Spring的Web框架是一个设计良好的Web MVC框架,它为Web框架提供了一个很好的替代方案。 

事务管理: Spring提供了一致的事务管理界面,可以缩小到本地事务并扩展到全局事务(JTA)。 

异常处理: Spring提供了一个方便的API,用于将特定于技术的异常(由JDBC,Hibernate或JDO抛出)转换为一致的,未经检查的异常。

3、:核心容器(应用程序上下文)模块是什么?

这是基本的Spring模块,它提供了Spring框架的基本功能。BeanFactory是任何基于spring的应用程序的核心。Spring框架是在这个模块的顶部构建的,它构成了Spring容器。

4、:AOP模块是什么?

        AOP模块用于为我们的Spring应用程序开发方面。AOP联盟提供了大部分支持,以确保Spring与其他AOP框架之间的互操作性。该模块还向Spring引入了元数据编程。

        面向切面编程(也叫面向方面):Aspect Oriented Programming(AOP),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。  AOP是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面(方面)编程。主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。   主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改 变这些行为的时候不影响业务逻辑的代码。

5、:解释一下JDBC抽象和DAO模块

使用JDBC抽象和DAO模块,我们可以确保我们使数据库代码保持干净和简单,并防止因无法关闭数据库资源而导致的问题。它在几个数据库服务器给出的错误消息之上提供了一层有意义的异常。它还利用Spring的AOP模块为Spring应用程序中的对象提供事务管理服务。

6、:解释一下对象/关系映射集成模块

通过提供ORM模块,Spring还支持在直接JDBC上使用对象/关系映射(ORM)工具。Spring支持绑定到几个流行的ORM框架,包括Hibernate,JDO和iBATIS SQL Maps。Spring的事务管理支持每个ORM框架以及JDBC。

7、:web模块的作用是什么?

Spring Web模块构建在应用程序上下文模块上,提供适用于基于Web的应用程序的上下文。此模块还包含对几个面向Web的任务的支持,例如透明地处理文件上载的多部分请求以及将请求参数编程绑定到业务对象。它还包含与Jakarta Struts的集成支持。

8、:Spring MVC模块的作用是什么?

Spring提供了MVC框架来构建Web应用程序。Spring可以很容易地与其他MVC框架集成,但是Spring的MVC框架是更好的选择,因为它使用IoC来提供控制器逻辑与业务对象的清晰分离。使用Spring MVC,您可以声明性地将请求参数绑定到业务对象。

9、:什么是Spring配置文件?

Spring配置文件是一个XML文件。此文件包含类信息,并描述了这些类是如何配置和相互引入的。

10、:什么是Spring IoC容器?

Spring IoC负责创建对象,管理它们(使用依赖注入(DI)),将它们连接在一起,配置它们,以及管理它们的整个生命周期。

11、:IOC有什么好处?

其一是控制,其二是反转。在程序中,被调用类的选择控制权从调用它的类中移除,转交给第三方裁决。这个第三方指的就是Spring的容器。IoC另解,依赖注入(Dependency Injection),调用类对被调用类的依赖关系由第三方注入,以移除调用类对被调用类的引用。

接口驱动设计(Interface Driven Design)的好处,可以灵活提供不同的子类实现(其实就是解耦),提高程序的灵活性、可扩展性和可维护性。IOC模式将耦合代码从程序中移出,放到统一的XML文件中管理。由IOC容器通过配置文件来管理对象的生命周期、依赖关系等,这样就不用重新修改并编译具体的代码,从而实现组件之间的解耦,提高程序的灵活性和可维护性。

IOC的缺点:

1、创建对象的步骤变复杂了,不直观,当然这是对不习惯这种方式的人来说的。

2、因为使用反射来创建对象,所以在效率上会有些损耗。但相对于程序的灵活性和可维护性来说,这点损耗是微不足道的。

3、缺少IDE重构的支持,如果修改了类名,还需到XML文件中手动修改,这似乎是所有XML方式的缺憾所在。

 

12、:ApplicationContext的常见实现是什么?

FileSystemXmlApplicationContext容器从XML文件加载bean的定义。必须将XML bean配置文件的完整路径提供给构造函数。

ClassPathXmlApplicationContext的容器还加载从XML文件java bean的定义。在这里,您需要正确设置CLASSPATH,因为此容器将在CLASSPATH中查找bean配置XML文件。

WebXmlApplicationContext:容器从Web应用程序中加载的所有bean类定义的XML文件。

 

13、:Bean Factory和ApplicationContext有什么区别?

BeanFactory是Spring里面最低层的接口,提供了最简单的容器的功能,只提供了实例化对象和拿对象的功能;

ApplicationContext:应用上下文,继承BeanFactory接口,它是Spring的一各更高级的容器,提供了更多的有用的功能;

1) 国际化(MessageSource)

2) 访问资源,如URL和文件(ResourceLoader)

3) 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层  

4) 消息发送、响应机制(ApplicationEventPublisher)

5) AOP(拦截器)

BeanFactory在启动的时候不会去实例化Bean,只有从容器中拿Bean的时候才会去实例化;

ApplicationContext在启动的时候就把所有的Bean全部实例化了。它还可以为Bean配置lazy-init=true来让Bean延迟实例化;

 

14、:什么是Spring中的依赖注入?

依赖注入是控制反转(IoC)的一个方面,它是一个通用概念,它可以用许多不同的方式表达。这个概念说你不创建你的对象,而是描述它们应该如何创建。您不能在代码中直接连接组件和服务,而是描述配置文件中哪些组件需要哪些服务。然后,一个容器(IOC容器)负责将其全部挂起。

15、:有哪些不同类型的IoC(依赖注入)?

基于构造函数的依赖注入:当容器调用具有许多参数的类构造函数时,完成基于构造函数的DI,每个参数表示对其他类的依赖。 基于Setter的依赖注入:基于Setter的DI是在调用无参数构造函数或无参数静态工厂方法来实例化bean之后,通过容器调用bean上的setter方法来完成的。

16、:Spring bean是什么?

Spring Beans是构成Spring应用程序主干的Java对象。它们由Spring IoC容器实例化,组装和管理。这些bean是使用提供给容器的配置元数据创建的,例如,以XML定义的形式。

在spring框架中定义的bean是singleton bean。如果指定为true,则bean标记中有一个名为“singleton”的属性,然后bean变为singleton,如果设置为false,则bean将成为原型bean。默认情况下,它设置为true。因此,spring框架中的所有bean都是默认的单例bean。

17、:如何为Spring容器提供配置元数据?

为Spring容器提供配置元数据有三种重要方法:

  • 基于XML的配置文件。 

            设值注入:bean必须有一个无参的构造方法,为属性提供set方法,使用<property>元素为每个属性注入值
            构造输入:必须提供有参数的构造方法,使用<constructor-arg>元素为每个属性注入值

  • 基于注释的配置。

            @Component 用于描述spring中的bean,表示一个组件
            
            @Repository 用于将数据访问层DAO的类标识为spring中的Bean
            
            @Service:用于将业务层的类标识为spring中的Bean
            
            @Controller:用于将控制层的类标识为spring中的Bean
            
            @Autowired:用于对Bean的属性变量、set方法以及构造方法进行标注,配合对应的注解处理器完成bean的自动配置
            
            @Resource,与Autowired一样,Resource中有两个重要属性 name type,spring将name属性解析为Bean的实例名称,
                type属性解析为实例类型
                
            @Qualifier:与Autowired注解配合使用,会将默认的按Bean类型装配修改为按Bean的实例名称装配

  • 基于Java的配置。

18、:如何定义bean的范围?

在Spring中定义一个时,我们也可以为bean声明一个范围。它可以通过bean定义中的scope属性定义。例如,当Spring每次需要生成一个新的bean实例时,bean's scope属性设为prototype。另一方面,当每次需要Spring都必须返回相同的bean实例时,bean scope属性必须设置为singleton。

19、:Spring支持的bean范围有哪些?

Spring Framework支持以下五个范围提供了五个范围:

在作用域的单重态中,Spring将bean定义范围限定为每个Spring IoC容器的单个实例。 

在原型范围中,单个bean定义具有任意数量的对象实例。 

在请求范围中,bean被定义为HTTP请求。此范围仅在Web感知的Spring ApplicationContext中有效。 

在会话范围中,bean定义的范围限定为HTTP会话。此范围仅在Web感知的Spring ApplicationContext中有效。 

在全局会话范围中,bean定义的范围限定为全局HTTP会话。这也是Web感知Spring ApplicationContext中使用的一种情况。 Spring Bean的默认范围是Singleton。

20、:Spring Framework中的Singleton bean线程安全吗?

不,单例bean在Spring框架中不是线程安全的,除非所有的操作都不会改变改变所共享的对象的属性或状态。

21、:解释Spring框架中的Bean生命周期

  1. spring容器从XML文件中查找bean的定义并实例化bean。 
  2. Spring填充bean定义(DI)中指定的所有属性。 
  3. 如果bean实现了StringNameAware接口,则spring将bean的id传递给setBeanName() 
  4. 如果Bean 实现了BeanFactoryAware接口,spring将beanfactory传递给setBeanFactory() 
  5. 如果有任何与bean关联的bean 实现了BeanPostProcessors,则Spring调用postProcesserBeforeInitialization() 
  6. 如果bean 实现了 IntializingBean,则调用其afterPropertySet()方法。
  7. 如果bean具有init方法声明,则调用指定的初始化方法。 或者调用bean中自己定制的初始化方法:配置文件中配置init-method
  8. 如果有任何与Bean关联的BeanPostProcessors,则将调用它们的postProcessAfterInitialization()方法。 
  9. 如果bean实现了DisposableBean,它将调用destroy()。或者配置文件中指定自定义的销毁方法:destroy-method

22、:哪些是重要的bean生命周期方法?可以覆盖它们吗?

有两个重要的bean生命周期方法。第一个是setup,当bean加载到容器中时调用。第二种方法是拆卸方法,当从容器中卸载bean时调用该方法。

bean标记有两个重要的属性(init-method和destroy-method),您可以使用它们定义自己的自定义初始化和销毁方法。还有相应的注释(@PostConstruct和@PreDestroy)。

23、:Spring的内部beans是什么?

当bean仅用作另一个bean的属性时,可以将其声明为内部bean。Spring的基于XML的配置元数据提供了bean定义中元素的使用,以便定义所谓的内部bean。内部bean总是匿名的,它们总是作为原型。

24、:如何在Spring中注入Java Collection?

Spring提供以下类型的集合配置元素:

<list> :   该标签用来装配可重复的list值。

<set> :    该标签用来装配没有重复的set值。

<map>:   该标签可用来注入键和值可以为任何类型的键值对。

<props> : 该标签支持注入键和值都是字符串类型的键值对。

<property name="customList">
    <list>
        <value>INDIA</value>
        <value>Pakistan</value>
        <value>USA</value>
        <value>UK</value>
    </list>
</property>

<property name="customSet">
    <set>
        <value>INDIA</value>
        <value>Pakistan</value>
        <value>USA</value>
        <value>UK</value>
    </set>
</property>

<property name="customMap">
    <map>
        <entry key="1" value="INDIA"/>
        <entry key="2" value="Pakistan"/>
        <entry key="3" value="USA"/>
        <entry key="4" value="UK"/>
    </map>
</property>

<property name="customProperies">
    <props>
        <prop key="admin">admin@nospam.com</prop>
        <prop key="support">support@nospam.com</prop>
    </props>
</property>

25、:Spring注解Resource和Autowired区别对比

@Resource默认按照名称方式进行bean匹配,@Resource并不是Spring的注解,它的包是javax.annotation.Resource

@Autowired默认按照类型方式进行bean匹配,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。

@Resource装配顺序:

①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。

②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。

③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。

④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。

 

26、:什么是bean auto wiring?

自动装配是使用spring满足bean依赖的一种方法,满足依赖的过程中,spring会在应用上下文中为某个bean寻找其依赖的bean。 

27、:解释不同的自动接线方式?

自动装配功能有五种模式,可用于指示Spring容器使用自动装配进行依赖注入:

no: 这是默认设置。应使用显式bean引用进行布线。 

byName: 当自动装配byName时,Spring容器会查看在XML配置文件中autowireattribute设置为byName的bean的属性。然后,它尝试匹配并将其属性与配置文件中由相同名称定义的bean相连。 

byType: 当按数据类型进行自动装配时,Spring容器会在XML配置文件中查看autowireattribute设置为byType的bean的属性。然后,如果属性的类型与配置文件中的一个bean名称匹配,则会尝试匹配并连接属性。如果存在多个这样的bean,则抛出致命异常。 

构造函数:此模式类似于byType,但type适用于构造函数参数。如果容器中没有构造函数参数类型的一个bean,则会引发致命错误。 

autodetect: Spring首先尝试通过构造函数使用autowire连接,如果它不起作用,Spring会尝试通过byType来自动装配。

28、:autowiring有限制吗?

autowiring的局限性是:

覆盖:您仍然可以使用和设置指定依赖项,这将始终覆盖自动装配。 

基元数据类型: 您不能自动装配简单属性,例如基元,字符串和类。 

令人困惑的性质:自动装配不如显式布线精确,因此如果可能,请使用明确的布线。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值