锁屏面试题百日百刷-Spring篇(三)

  锁屏面试题百日百刷-Spring篇(三)

  锁屏面试题百日百刷,每个工作日坚持更新面试题。锁屏面试题app、小程序现已上线,官网地址:https://www.demosoftware.cc/#/introductionPage,已收录了每日更新的面试题的所有内容,还包含特色的解锁屏幕复习面试题、每日编程题目邮件推送等功能。让你在面试中先人一步,吊打面试官!接下来的是今日的面试题:

 

 

1、什么是 Spring 的依赖注入

 

平常的 java 开发中,程序员在某个类中需要依赖其它类的方法,则通常是 new 一个依赖类再调用类实例的方法,这种开发存在的问题是 new 的类实例不好统一管理,spring 提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过 spring 容器帮我们 new 指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们 new 一个实例,这个实例的控制权是我们程序员,而控制反转是指 new 实例工作不由我们程序员来做而是交给 spring 容器来做。

 

 

 

2、有哪些不同类型的依赖注入方式?

 

Spring 提供了多种依赖注入的方式。

 

  1. Set 注入

 

<!--配置bean,配置后该类由spring管理-->

 

<bean name="springAction" class="com.bless.springdemo.action.SpringAction">

 

<!--依赖注入,配置当前类中相应的属性-->

 

<property name="springDao" ref="springDao"></property>

 

</bean>

 

<bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean>

 

 

 

  1. 构造器注入

 

<!--配置bean,配置后该类由spring管理-->

 

<bean name="springAction" class="com.bless.springdemo.action.SpringAction">

 

<!--创建构造器注入,如果主类有带参的构造方法则需添加此配置-->

 

<constructor-arg ref="springDao"></constructor-arg>

 

<constructor-arg ref="user"></constructor-arg>

 

</bean>

 

<bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean>

 

<bean name="user" class="com.bless.springdemo.vo.User"></bean>

 

 

 

  1. 静态工厂的方法注入

 

<!--配置bean,配置后该类由spring管理-->

 

<bean name="springAction" class="com.bless.springdemo.action.SpringAction" >

 

<!--使用静态工厂的方法注入对象,对应下面的配置文件)-->

 

<property name="staticFactoryDao" ref="staticFactoryDao"></property>

 

</property>

 

</bean>

 

<!--此处获取对象的方式是从工厂类中获取静态方法-->

 

<bean name="staticFactoryDao" class="com.bless.springdemo.factory.DaoFactory" factory-method="getStaticFactoryDaoImpl"></bean>

 

 

 

  1. 实例工厂的方法注入

 

<!--配置bean,配置后该类由spring管理-->

 

<bean name="springAction" class="com.bless.springdemo.action.SpringAction">

 

<!--使用实例工厂的方法注入对象,对应下面的配置文件-->

 

<property name="factoryDao" ref="factoryDao"></property>

 

</bean>

 

<!--此处获取对象的方式是从工厂类中获取实例方法-->

 

<bean name="daoFactory" class="com.bless.springdemo.factory.DaoFactory"></bean>

 

<bean name="factoryDao" factory-bean="daoFactory" factory-method="getFactoryDaoImpl"></bean>

 

 

 

3、什么是 Spring beans?

 

Spring beans 是那些形成 Spring 应用的主干的 java 对象。它们被 Spring IOC 容器初始化,装配,和管理。这些 beans 通过容器中配置的元数据创建。比如,以 XML 文件中<bean/> 的形式定义。Spring 框架定义的 beans 默认都是单例 beans。

 

 

 

4、一个 Spring Beans 的定义需要包含什么?

 

一个 Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个 bean,它的生命周期详情及它的依赖。

 

 

 

5、你怎样定义类的作用域?

 

当定义一个<bean> 在 Spring 里,我们还能给这个 bean 声明一个作用域。它可以通过 bean 定义中的 scope 属性来定义。如,当 Spring 要在需要的时候每次生产一个新的 bean 实例,bean 的 scope 属性被指定为 prototype。

 

另一方面,一个 bean 每次使用的时候必须返回同一个实例,这个 bean 的 scope 属性必须设为 singleton。

 

 

 

6、Spring 支持的几种 bean 的作用域?

 

Spring 框架支持以下五种 bean 的作用域:

 

singleton : bean 在每个 Spring ioc 容器中只有一个实例。

 

prototype:一个 bean 的定义可以有多个实例。

 

request:每次 http 请求都会创建一个 bean,该作用域仅在基于 web 的 Spring ApplicationContext 情形下有效。

 

session :在一个 HTTP Session 中 , 一 个 bean 定义对应一个实例。该作用域仅在基于 web 的Spring ApplicationContext 情形下有效。

 

global-session:在一个全局的 HTTP Session 中,一个 bean 定义对应一个实例。该作用域仅在基于 web 的Spring ApplicationContext 情形下有效。

 

缺省的 Spring bean 的作用域是 Singleton。

 

 

 

7、Spring 框架中的单例 bean 是线程安全的吗?

 

不是线程安全的。

 

 

 

8、什么是 Spring 的内部 bean?

 

当一个 bean 仅被用作另一个 bean 的属性时,它能被声明为一个内部 bean,为了定义 inner bean,在Spring 的 基于 XML 的 配置元数据中,可以在 <property/>或 <constructor-arg/> 元素内使用<bean/> 元素,内部 bean 通常是匿名的,它们的 Scope 一般是 prototype。

 

<?xml version="1.0" encoding="UTF-8"?>

 

<beans xmlns="http://www.springframework.org/schema/beans"

 

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

 

    <bean id="person2" class="com.itdjx.spring.dependency.injection.Person">

 

        <property name="name" value="李玉"/>

 

        <property name="age" value="23"/>

 

        <property name="sex" value="女"/>

 

        <property name="car" >

 

            <bean class="com.itdjx.spring.dependency.injection.Car">

 

                <constructor-arg value="Ferrari" index="0"/>

 

                <constructor-arg value="Italy" index="1"/>

 

                <constructor-arg value="22500000" type="double"/>

 

            </bean>

 

        </property>

 

    </bean>

 

</beans>

 

 

 

 

  更多面试题可关注"demo锁屏面试题"公众号通过小程序或App学习面试题

 

上一篇:Spring或Springboot注册组件的四种方式


下一篇:Rabbitmq点对点通信