Spring【面试题】

616 阅读10分钟

Spring简介

1. 什么是Spring?
Spring 是个Java企业级应用的开源开发框架。旨在降低应用程序开发的复杂度

2. 使用Spring框架的好处是什么?
轻量:Spring 是轻量的,基本的版本大约2MB
控制反转(IoC):Spring通过控制反转实现了松耦合。 (软件设计中的【耦合】指,两个功能函数之间的依赖程度)
面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开
容器:Spring 包含并管理应用中对象的生命周期和配置
MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品
事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)

3. Spring由哪些模块组成?
简单可以分成6大模块:

Spring Core     spring的核心功能: IOC容器, 解决对象创建及依赖关系

Spring Web      Spring对web模块的支持。

                ---可以与struts整合,让struts的action创建交给spring

                ---spring mvc模式

Spring DAO      Spring 对jdbc操作的支持  【JdbcTemplate模板工具类】

Spring ORM      spring对orm的支持:

                ---既可以与hibernate整合,【session】

                ---也可以使用spring的对hibernate操作的封装

Spring AOP      切面编程

SpringEE        spring 对javaEE其他模块的支持

4. 核心容器(Core) 模块
这是基本的Spring模块,提供Spring 框架的基础功能,BeanFactory是任何以Spring为基础的应用的核心。Spring的本质是一个bean工厂(beanFactory)或者说bean容器

依赖注入

1.什么是Spring的依赖注入?
依赖注入,是IOC的一个方面,不用创建对象,而只需要描述它如何被创建。不用在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后由IOC容器负责把他们组装起来。

2. 有哪些不同类型的IoC(依赖注入)方式?
setter方法注入:setter方法注入是容器通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入
构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖
• 工厂注入:这个是遗留下来的,很少用的了

3. 哪种依赖注入方式你建议使用,构造器注入,还是 Setter方法注入?
两种依赖方式都可以使用,最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖

4.Spring 中有多少种 IoC 容器?
BeanFactory - BeanFactory 就像一个包含 bean 集合的工厂类。它会在客户端要求时实例化 bean
ApplicationContext - ApplicationContext 接口扩展了 BeanFactory 接口。它在 BeanFactory 基础上提供了一些额外的功能

5.列举 IoC 的一些好处
• 它将最小化应用程序中的代码量
• 它以最小的影响和最少的侵入机制促进松耦合

Spring Beans

1.什么是Spring beans?
Spring beans 是那些形成Spring应用的java对象。它们被Spring IoC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中<bean/>的形式定义

2. 如何给Spring 容器提供配置元数据?
有3种重要的方法给Spring 容器提供配置元数据:
XML配置文件: bean 所需的依赖项和服务在 XML 格式的配置文件中指定。它们通常以 bean 标签开头。例如:

<bean id="studentbean" class="org.edureka.firstSpring.StudentBean">  
<property name="name" value="Edureka"></property> 
</bean>

基于注解的配置: 可以通过在相关的类,方法或字段声明上使用注解,将 bean 配置为组件类本身。默认情况下,Spring 容器中未打开注解装配。因此,需要在使用它之前在 Spring 配置文件中启用它。例如:

<beans>  <context:annotation-config/> 
<!-- bean definitions go here -->  </beans>

基于Java的配置: Spring 的 Java 配置是通过使用 @Bean@Configuration 来实现

@Bean 注解扮演与 <bean/> 元素相同的角色。
@Configuration 类允许通过简单地调用同一个类中的其他@Bean方法来定义 bean 间依赖关系

@Configuration 
public class StudentConfig { 
    @Bean  
    public StudentBean myStudent() { 
        return new StudentBean(); 
        } 
} 

3. Spring框架中的单例bean是线程安全的吗?
Spring框架中的单例bean不是线程安全的

4. 解释Spring框架中bean的生命周期
• Spring IoC容器从XML 文件中读取bean的定义,并实例化bean
• Spring IoC容器对bean进行依赖注入
• 将bean的实例传递给bean后置处理器的postProcessBeforeInitialization方法
• 调用bean的初始化方法 (init-method)
• 将bean的实例传递给bean后置处理器的postProcessAfterInitialization方法
• bean可以使用了
• 当销毁Bean实例时,则调用其destroy方法

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

6. 在 Spring中如何注入一个java集合?
Spring提供以下几种集合的配置元素:

<list>类型用于注入一列值,允许有相同的值
<set> 类型用于注入一组值,不允许有相同的值
<map> 类型用于注入一组键值对,键和值都可以为任意类型
<props>类型用于注入一组键值对,键和值都只能为String类型

7. 什么是bean装配?
当bean在Spring容器中组合在一起时,它被称为bean装配,前提是容器需要知道bean的依赖关系,如何通过依赖注入来把它们装配到一起

8. 什么是bean的自动装配?
Spring 容器能够自动装配相互合作的bean,这意味着容器不需要<constructor-arg><property>配置,能通过Bean工厂自动处理bean之间的协作

9. 解释不同方式的自动装配
5种自动装配的方式,可以用来指导Spring容器用自动装配方式来进行依赖注入
no:默认的方式是不进行自动装配,通过显式设置ref属性来进行装配
byName:通过参数名自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,之后容器试图匹配、装配和该bean的属性具有相同名字的bean
byType:通过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,之后容器试图匹配、装配和该bean的属性具有相同类型的bean。如果有多个bean符合条件,则抛出错误
constructor:这个方式类似于byType,但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常
autodetect:首先尝试使用constructor来自动装配,如果无法工作,则使用byType方式。

Spring注解

1. 什么是基于Java的Spring注解配置? 给一些注解的例子.
基于Java的配置,允许你在少量的Java注解的帮助下,进行你的大部分Spring配置而非通过XML文件。 @Configuration注解为例,它用来标记类可以当做一个bean的定义,被Spring IOC容器使用。另一个例子是
@Bean注解,它表示此方法将要返回一个对象,作为一个bean注册进Spring应用上下文

2. 怎样开启注解装配?
注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在Spring配置文件中配置 <context:annotation-config/>元素开启它

3. @Component, @Controller, @Repository, @Service 有何区别?
注解后都可以被Spring框架所扫描并注入到Spring的bean容器中来进行管理,让一个类变成bean。
@Controller 作用于表现层用于标注控制器类(spring-mvc的注解)
@Service 作用于业务逻辑层
@Repository 作用于持久层用于标注DAO类
@Component 最普通的组件,可以被注入到Spring容器进行管理,当我们无法区分这个类属于MVC的那个层次时就可以使用这个注解。

4. @Resource(name=“”) 注解,@Autowired 注解,@Require注解和@Qualifier 注解
@Resource和@Autowired都可以用来装配bean,都可以写在字段上或者是写在setter方法上
@Resource默认是按照byName进行装配的,名称可以通过name属性进行指定
@Autowired默认是按照byType进行装配的
@Required注释应用于 bean 属性的 setter 方法,它表明受影响的bean属性在配置时必须放在XML配置文件中,否则容器就会抛出一个 BeanInitializationException 异常。
当有多个相同类型的bean却只有一个需要自动装配时,将@Qualifier注解和@Autowire 注解结合使用指定需要装配的确切的bean。

Spring数据访问

1. Spring对DAO的支持
Spring对数据访问对象(DAO)的支持旨在简化它和数据访问技术如JDBC,Hibernate or JDO 结合使用。这使我们可以方便切换持久层。编码时也不用担心会捕获每种技术特有的异常。

2. Spring支持的ORM

Hibernate
iBatis
JPA (Java Persistence API)
TopLink
JDO (Java Data Objects)
OJB

3. Spring支持的事务管理类型
Spring支持两种类型的事务管理:

编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。
声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务

大多数Spring框架的用户选择声明式事务管理,因为它对应用代码的影响最小,因此更符合一个无侵入的轻量级容器的思想。

Spring面向切面编程(AOP)

1. 解释AOP
AOP(Aspect-Oriented Programming,[ˈæspekt]-[ˈɔːrientɪd] [ˈprəʊɡræmɪŋ]), 即面向切面编程, 是OOP(Object-Oriented Programming, 面向对象编程)编程的有效补充。在OOP中最小的单元是类(class),而在AOP中最小的单元是切面(aspect)。
通俗地讲就是,AOP有助于我们将不同但是有必要的重复性代码(比如权限管理,事物管理,日志记录等等)独立提取出来,独立实现,然后通过切面切入进系统。这么做的好处是,我们可以将这些重复性代码集中管理起来复用,而不是每次都要重复写一遍。
代码将会变得更易于维护,从而将业务逻辑从杂乱的代码中脱离出来,专注于业务逻辑代码的开发

2. 什么是代理?以及Spring AOP 采用哪种代理?
代理模式的核心作用就是通过代理,控制对对象的访问。JDK动态代理CGLIB动态代理均是实现Spring AOP的基础
总结 Spring AOP 中的代理使用逻辑了:如果目标对象实现了接口,默认情况下会采用 JDK 的动态代理实现 AOP;如果目标对象没有实现了接口,则采用 CGLIB 动态代理,Spring 会自动在 JDK 和 CGLIB 动态代理之间转换。