【2021最新版】Spring面试题总结(131道题含答案解析)

文章目录

最近面试的小伙伴不少,对此我整理了一份Java面试题手册:基础知识、JavaOOP、Java集合/泛型面试题、Java异常面试题、Java中的IO与NIO面试题、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、SpringBoot、SpringCloud、RabbitMQ、Dubbo、MyBatis、ZooKeeper、数据结构、算法、Elasticsearch、Kafka、微服务、Linux等等。能够分享给你们学习。【持续更新中】前端

完整版Java面试题地址:【2021最新版】Java面试真题汇总java

序号 内容 地址连接
1 【2021最新版】JavaOOP面试题总结 http://www.noobyard.com/article/p-rncfmibs-oe.html
2 【2021最新版】Java基础面试题总结 http://www.noobyard.com/article/p-ykqnztan-oe.html
3 【2021最新版】多线程&并发面试题总结 http://www.noobyard.com/article/p-nhidektg-oe.html
4 【2021最新版】JVM面试题总结 http://www.noobyard.com/article/p-anzurdyn-oe.html
5 【2021最新版】Mysql面试题总结 http://www.noobyard.com/article/p-vvarpaer-oe.html
6 【2021最新版】Redis面试题总结 http://www.noobyard.com/article/p-gpqwxdxv-oe.html
7 【2021最新版】Memcached面试题总结 http://www.noobyard.com/article/p-hiwezhqi-oe.html
8 【2021最新版】MongoDB面试题总结 http://www.noobyard.com/article/p-qsqnmsta-oe.html
9 【2021最新版】Spring Boot面试题总结 未更新
10 【2021最新版】Spring Cloud面试题总结 未更新
11 【2021最新版】RabbitMQ面试题总结 未更新
12 【2021最新版】Dubbo面试题总结 未更新
13 【2021最新版】MyBatis面试题总结 未更新
14 【2021最新版】ZooKeeper面试题总结 未更新
15 【2021最新版】数据结构面试题总结 未更新
16 【2021最新版】算法面试题总结 未更新
17 【2021最新版】Elasticsearch面试题总结 未更新
18 【2021最新版】Kafka面试题总结 未更新
19 【2021最新版】微服务面试题总结 未更新
20 【2021最新版】Linux面试题总结 未更新

通常问题

一、不一样版本的Spring Framework有哪些主要功能?

答:
git

二、什么是Spring Framework?

答:github

Spring是一个开源应用框架,旨在下降应用程序开发的复杂度。它是轻量级、松散耦合的。它具备分层体系结构,容许用户选择组件,同时还为J2EE应用程序开发提供了一个有凝聚力的框架。它能够集成其余框架,如 Structs、Hibernate、EJB 等,因此又称为框架的框架。web

三、列举Spring Framework的优势。

答:面试

因为Spring Frameworks 的分层架构,用户能够自由选择本身须要的组件。Spring Framework支持POJO(Plain Old Java Object) 编程,从而具有持续集成和可测试性。因为依赖注入和控制反转,JDBC得以简化。它是开源免费的。算法

四、Spring Framework有哪些不一样的功能?

答:spring

轻量级-Spring 在代码量和透明度方面都很轻便。sql

IOC-控制反转AOP-面向切面编程能够将应用业务逻辑和系统服务分离,以实现高内聚。容器-Spring 负责建立和管理对象(Bean)的生命周期和配置。MVC-对web应用提供了高度可配置性,其余框架的集成也十分方便。事务管理 - 提供了用于事务管理的通用抽象层。Spring的事务支持也可用于容器较少的环境。JDBC异常-Spring的JDBC抽象层提供了一个异常层次结构,简化了错误处理策略。数据库

五、Spring Framework中有多少个模块,它们分别是什么?

答:


在这里插入图片描述

六、什么是Spring配置文件?

答:

Spring配置文件是XML文件。该文件主要包含类信息。它描述了这些类是如何配置以及相互引入的。可是,XML配置文件冗长且更加干净。若是没有正确规划和编写,那么在大项目中管理变得很是困难。

七、Spring应用程序有哪些不一样组件?

答:

Spring应用通常有如下组件:

接口-定义功能。

Bean 类-它包含属性,setter和getter方法,函数等。

Spring面向切面编程(AOP) -提供面向切面编程的功能。

Bean配置文件-包含类的信息以及如何配置它们。

用户程序-它使用接口。

八、使用Spring有哪些方式?

答:

使用Spring有如下方式:

做为一个成熟的Spring Web应用程序。

做为第三方Web框架,使用Spring Frameworks中间层。

用于远程使用。

做为企业级Java Bean,它能够包装现有的POJO(Plain Old Java Objects)。

依赖注入(Ioc)

一、什么是Spring IOC容器?

答:

Spring框架的核心是Spring容器。容器建立对象,将它们装配在一块儿,配置它们并管理它们的完整生命周期。Spring容器使用依赖注入来管理组成应用程序的组件。容器经过读取提供的配置元数据来接收对象进行实例化,配置和组装的指令。该元数据能够经过XML,Java注解或Java代码提供。

二、什么是依赖注入?

答:

在依赖注入中,您没必要建立对象,但必须描述如何建立它们。您不是直接在代码中将组件和服务链接在一块儿,而是描述配置文件中哪些组件须要哪些服务。由IoC容器将它们装配在一块儿。

三、能够经过多少种方式完成依赖注入?

答:

在这里插入图片描述

四、区分构造函数注入和setter注入。

答:

在这里插入图片描述

五、spring中有多少种IOC容器?

答:

BeanFactory-BeanFactory就像一个包含bean集合的工厂类。它会在客户端要求时实例化bean。

ApplicationContext-ApplicationContext 接口扩展了BeanFactory接口。它在BeanFactory基础上提供了一些额外的功能。

六、区分BeanFactory和ApplicationContext。

答:

七、列举IoC的一些好处。

答:

八、Spring IoC的实现机制。

答:

Spring中的IoC的实现原理就是工厂模式加反射机制。

实例:

interface Fruit { 
 
  
	public abstract void eat();
}
class Apple implements Fruit { 
 
  
	public void eat(){ 
 
  
		System.out.println("Apple");
	}
}
class Orange implements Fruit { 
 
  
	public void eat(){ 
 
  
		System.out.println("Orange");
	}
}
class Factory { 
 
  
	public static Fruit getInstance(String ClassName) { 
 
  
		Fruit f=null;
		try { 
 
  
			f=(Fruit)Class.forName(ClassName).newInstance();
		}
		catch (Exception e) { 
 
  
			e.printStackTrace();
		}
		return f;
	}
}
class Client { 
 
  
	public static void main(String[] a) { 
 
  
		Fruit f=Factory.getInstance("io.github.dunwu.spring.Apple");
		if(f!=null){ 
 
  
			f.eat();
		}
	}
}

Beans

一、什么是spring bean?

答:

二、spring提供了哪些配置方式?

答:

基于xml配置

bean所需的依赖项和服务在 XML 格式的配置文件中指定。这些配置文件一般包含许多bean定义和特定于应用程序的配置选项。它们一般以bean标签开头。例如:

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

基于注解配置

您能够经过在相关的类,方法或字段声明上使用注解,将bean配置为组件类自己,而不是使用XML来描述bean装配。默认状况下,Spring容器中未打开注解装配。所以,您须要在使用它以前在Spring配置文件中启用它。例如:

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

基于Java API配置

Spring 的 Java配置是经过使用@Bean和@Configuration 来实现。

一、 @Bean注解扮演与元素相同的角色。

二、 @Configuration类容许经过简单地调用同一个类中的其余@Bean方法来定义bean间依赖关系。

例如:

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

三、spring支持集中bean scope?

答:

Spring bean支持5种scope:

Singleton-每一个Spring IoC容器仅有一个单实例。Prototype-每次请求都会产生一个新的实例。Request-每一次HTTP请求都会产生一个新的实例,而且该bean仅在当前 HTTP 请求内有效。Session-每一次 HTTP请求都会产生一个新的 bean,同时该 bean仅在当前HTTP session内有效。Global-session-相似于标准的HTTP Session做用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被全部构成某个portlet web应用的各类不一样的portlet所共享。在 globalsession做用域中定义的bean被限定于全局portlet Session的生命周期范围内。

若是你在web中使用global session做用域来标识bean,那么web会自动当成session类型来使用。

仅当用户使用支持Web的 ApplicationContext 时,最后三个才可用。

四、spring bean容器的生命周期是什么样的?

答:

spring bean容器的生命周期流程以下:

一、Spring容器根据配置中的bean定义中实例化bean。

二、Spring使用依赖注入填充全部属性,如bean中所定义的配置。

三、若是bean实现BeanNameAware 接口,则工厂经过传递bean的ID来调用setBeanName()。

四、若是bean实现BeanFactoryAware接口,工厂经过传递自身的实例来调用setBeanFactory()。

五、若是存在与bean关联的任何BeanPostProcessors,则调用preProcessBeforeInitialization() 方法。

六、若是为bean指定了init方法( 的init-method属性),那么将调用它。

七、最后,若是存在与bean关联的任何BeanPostProcessors,则将调用postProcessAfterInitialization() 方法。

八、若是bean实现DisposableBean接口,当spring容器关闭时,会调用destory()。

九、若是为bean指定了destroy方法( 的destroy-method属性),那么将调用它。

五、什么是spring的内部bean?

答:

只有将bean用做另外一个bean的属性时,才能将bean声明为内部bean。为了定义bean,Spring的基于XML的配置元数据在 或 中提供了 元素的使用。内部bean老是匿名的,它们老是做为原型。

例如,假设咱们有一个Student类,其中引用了Person 类。这里咱们将只建立一个Person类实例并在Student中使用它。

Student.java
public class Student { 
 
  
	private Person person;
	//Setters and Getters }public class Person { private String name; private String address; //Setters and Getters }

bean.xml

<bean id=“StudentBean" class="com.edureka.Student"> <property name="person"> <!--This is inner bean --> <bean class="com.edureka.Person"> <property name="name" value=“Scott"></property> <property name="address" value= “Bangalore"></property> </bean> </property> </bean>

六、什么是spring装配?

答:

当bean在Spring容器中组合在一块儿时,它被称为装配或bean装配。Spring容器须要知道须要什么bean以及容器应该如何使用依赖注入来将bean绑定在一块儿,同时装配bean。

七、自动装配有哪些方式?

答:

Spring容器可以自动装配bean。也就是说,能够经过检查BeanFactory的内容让Spring自动解析bean的协做者。

自动装配的不一样模式:

no-这是默认设置,表示没有自动装配。应使用显式bean引用进行装配。byName-它根据bean的名称注入对象依赖项。它匹配并装配其属性与XML文件中由相同名称定义的bean。
byType-它根据类型注入对象依赖项。若是属性的类型与XML文件中的一个bean名称匹配,则匹配并装配属性。构造函数-它经过调用类的构造函数来注入依赖项。它有大量的参数。autodetect-首先容器尝试经过构造函数使用autowire装配,若是不能,则尝试经过byType自动装配。

八、自动装配有什么局限?

答:

覆盖的可能性 - 您始终可使用 和 设置指定依赖项,这将覆盖自动装配。基本元数据类型 - 简单属性(如原数据类型,字符串和类)没法自动装配。使人困惑的性质 - 老是喜欢使用明确的装配,由于自动装配不太精确。

注解

一、什么是基于注解的容器配置?

答:

不使用XML来描述 bean 装配,开发人员经过在相关的类,方法或字段声明上使用注解将配置移动到组件类自己。它能够做为 XML设置的替代方案。例如:Spring的Java配置是经过使用@Bean和@Configuration来实现。 @Bean注解扮演与 元素相同的角色。@Configuration类容许经过简单地调用同一个类中的其余@Bean方法来定义bean间依赖关系。

例如:

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

二、如何在spring中启动注解装配?

答:

默认状况下,Spring容器中未打开注解装配。所以,要使用基于注解装配,咱们必须经过配置<context:annotation-config/> 元素在Spring配置文件中启用它。

三、@Component, @Controller, @Repository

答:

@Service有何区别?

@Component :这将java类标记为bean。它是任何Spring管理组件的通用构造型。spring的组件扫描机制如今能够将其拾取并将其拉入应用程序环境中。

@Controller :这将一个类标记为Spring Web MVC控制器。标有它的Bean会自动导入到IoC容器中。

@Service :此注解是组件注解的特化。它不会对@Component注解提供任何其余行为。您能够在服务层类中使用@Service 而不是@Component,由于它以更好的方式指定了意图。

@Repository :这个注解是具备相似用途和功能的@Component注解的特化。它为DAO提供了额外的好处。它将DAO导入 IoC容器,并使未经检查的异常有资格转换为Spring DataAccessException。

四、@Required注解有什么用?

答:

@Required 应用于bean属性setter方法。此注解仅指示必须在配置时使用bean 定义中的显式属性值或使用自动装配填充受影响的bean属性。若是还没有填充受影响的bean属性,则容器将抛出eanInitializationException。
示例:

public class Employee { 
 
  
	private String name;
	@Required public void setName(String name){ 
 
  
		this.name=name;
	}
	public string getName(){ 
 
  
		return name;
	}
}

五、@Autowired注解有什么用?

答:

@Autowired能够更准确地控制应该在何处以及如何进行自动装配。此注解用于在setter方法,构造函数,具备任意名称或多个参数的属性或方法上自动装配bean。默认状况下,它是类型驱动的注入。

public class Employee { 
 
  
	private String name;
	@Autowired public void setName(String name) { 
 
  
		this.name=name;
	}
	public string getName(){ 
 
  
		return name;
	}
}

六、@Qualifier注解有什么用?

答:

当您建立多个相同类型的bean并但愿仅使用属性装配其中一个bean时,您可使用@Qualifier 注解和@Autowired经过指定应该装配哪一个确切的bean来消除歧义。

例如,这里咱们分别有两个类,Employee和EmpAccount。在EmpAccount中,使用@Qualifier指定了必须装配id为emp1的bean。

Employee.java

public class Employee { 
 
  
	private String name;
	@Autowired public void setName(String name) { 
 
  
		this.name=name;
	}
	public string getName() { 
 
  
		return name;
	}
}

EmpAccount.java

public class EmpAccount { 
 
  
	private Employee emp;
	@Autowired @Qualifier(emp1) public void showName() { 
 
  
		System.out.println(“Employee name :+emp.getName);
	}
}

七、@RequestMapping注解有什么用?@Service有何区别?

答:

@RequestMapping 注解用于将特定HTTP请求方法映射到将处理相应请求的控制器中的特定类/方法。此注释可应用于两个级别:

类级别:映射请求的URL方法级别:映射URL以及HTTP请求方法

数据访问

一、spring DAO有什么用?

答:

Spring DAO使得JDBC,Hibernate或JDO这样的数据访问技术更容易以一种统一的方式工做。这使得用户容易在持久性技术之间切换。

它还容许您在编写代码时,无需考虑捕获每种技术不一样的异常。

二、列举Spring DAO抛出的异常。

答:

在这里插入图片描述

三、spring JDBC API中存在哪些类?

答:

四、使用Spring访问Hibernate的方法有哪些?

答:

咱们能够经过两种方式使用Spring访问Hibernate:

一、 使用Hibernate模板和回调进行控制反转

二、 扩展HibernateDAOSupport并应用AOP拦截器节点

五、列举spring支持的事务管理类型

答:

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

一、 程序化事务管理:在此过程当中,在编程的帮助下管理事务。它为您提供极大的灵活性,但维护起来很是困难。

二、 声明式事务管理:在此,事务管理与业务代码分离。仅使用注解或基于 XML的配置来管理事务。

六、spring支持哪些ORM框架

答:

AOP

一、什么是AOP

答:

AOP(Aspect-Oriented Programming), 即 面向切面编程, 它与OOP( Object-Oriented Programming, 面向对象编程) 相辅相成, 提供了与OOP不一样的抽象软件结构的视角,在OOP中, 咱们以类(class)做为咱们的基本单元, 而AOP中的基本单元是Aspect(切面)

二、什么是Aspect?

答:

aspect由pointcount和advice组成, 它既包含了横切逻辑的定义, 也包括了链接点的定义Spring AOP就是负责实施切面的框架, 它将切面所定义的横切逻辑编织到切面所指定的链接点中AOP的工做重心在于如何将加强编织目标对象的链接点上, 这里包含两个工做:

一、如何经过pointcut和advice定位到特定的joinpoint上

二、如何在advice中编写切面代码。

以简单地认为, 使用@Aspect注解的类就是切面。

三、什么是切点(JoinPoint)

答:

程序运行中的一些时间点, 例如一个方法的执行, 或者是一个异常的处理在Spring AOP中, join point老是方法的执行点。

四、什么是通知(Advice)?

答:

特定JoinPoint处的Aspect所采起的动做称为Advice。Spring AOP 使用一个 Advice做为拦截器,在JoinPoint “周围”维护一系列的拦截器。

五、有哪些类型的通知(Advice)?

答:

六、指出在spring aop中concern和cross-cuttingconcern的不一样之处。

答:

concern是咱们想要在应用程序的特定模块中定义的行为。它能够定义为咱们想要实现的功能 。
cross-cutting concern是一个适用于整个应用的行为,这会影响整个应用程序。例 如,日志记录,安全性和数据传输是应用程序几乎每一个模块都须要关注的问题,所以它们是跨领域的问题

七、AOP有哪些实现方式?

答:

实现AOP的技术,主要分为两大类 :

静态代理

指使用AOP框架提供的命令进行编译,从而在编译阶段就可生成AOP代理类,所以也称为编译时加强:

JDK动态代理

CGLIB

八、Spring AOP and AspectJ AOP有什么区别?

答:

Spring AOP基于动态代理方式实现;AspectJ基于静态代理方式实现。SpringAOP仅支持方法级别的PointCut;提供了彻底的 AOP支持,它还支持属性级别的PointCut。

九、如何理解Spring中的代理?

答:

将Advice应用于目标对象后建立的对象称为代理。在客户端对象的状况下,目标对象和代理对象是相同的。

Advice + Target Object = Proxy

十、什么是编织(Weaving)?

答:

为了建立一个advice对象而连接一个aspect和其它应用类型或对象,称为编织(Weaving)。在Spring AOP中,编织在运行时执行。请参考下图:

MVC

一、Spring MVC框架有什么用?

答:

Spring Web MVC框架提供 模型-视图-控制器 架构和随时可用的组件,用于开发灵活且松散耦合的Web应用程序。MVC模式有助于分离应用程序的不一样方面,如输入逻辑,业务逻辑和UI逻辑,同时在全部这些元素之间提供松散耦合。

二、描述一下DispatcherServlet的工做流程

答:

DispatcherServlet 的工做流程能够用一幅图来讲明:

三、介绍一下WebApplicationContext

答:

在这里插入图片描述
一、向服务器发送HTTP请求,请求被前端控制器DispatcherServlet捕获。

二、 DispatcherServlet根据-servlet.xml 中的配置对请求的URL进行解析,获得请求资源标识符(URI)。而后根据该URI,调用HandlerMapping得到该Handler配置的全部相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回。

三、 DispatcherServlet根据得到的Handler,选择一个合适的HandlerAdapter。(附注:若是成功得到HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)。

四、提取Request中的模型数据,填充Handler入参,开始执行Handler( Controller)。在填充Handler的入参过程当中,根据你的配置,Spring将帮你作一些额外的工做:
在这里插入图片描述
五、Handler(Controller)执行完成后,向DispatcherServlet返回一个ModelAndView对象;

六、根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给
DispatcherServlet。

七、 ViewResolver 结合Model和View,来渲染视图。

八、视图负责将渲染结果返回给客户端。

Spring面试题(二)

一、什么是spring?

答:

Spring是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,可是有些扩展是针对构建J2EE平台的web应用。Spring框架目标是简化Java企业级应用开发,并经过POJO为基础的编程模型促进良好的编程习惯。

二、使用Spring框架的好处是什么?

答:

三、Spring由哪些模块组成?

答:

五、BeanFactory–BeanFactory实现举例。

答:

Bean工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从正真的应用代码中分离。

最经常使用的BeanFactory实现是XmlBeanFactory类。

六、XMLBeanFactory

答:
最经常使用的就是org.springframework.beans.factory.xml.XmlBeanFactory ,它根据XML文件中的定义加载beans。该容器从XML文件读取配置元数据并用它去建立一个彻底配置的系统或应用。

七、解释AOP模块

答:
AOP模块用于发给咱们的Spring应用作面向切面的开发, 不少支持由AOP联盟提供,这样就确保了Spring和其余AOP框架的共通性。这个模块将元数据编程引入Spring。

八、解释JDBC抽象和DAO模块。

答:
经过使用JDBC抽象和DAO模块,保证数据库代码的简洁,并能避免数据库资源错误关闭致使的问题,它在各类不一样的数据库的错误信息之上,提供了一个统一的异常访问层。它还利用Spring的AOP模块给Spring应用中的对象提供事务管理服务。

九、解释对象/关系映射集成模块。

答:

Spring经过提供ORM模块,支持咱们在直接JDBC之上使用一个对象/关系映射映射(ORM)工具,Spring支持集成主流的 ORM 框架,如Hiberate,JDO和iBATISSQL Maps。Spring的事务管理一样支持以上全部 ORM 框架及JDBC。

十、解释WEB模块。

答:

Spring的WEB模块是构建在application context模块基础之上,提供一个适合web应用的上下文。这个模块也包括支持多种面向web的任务,如透明地处理多个文件上传请求和程序级请求参数的绑定到你的业务对象。它也有对JakartaStruts的支持。

十一、Spring配置文件

答:

Spring配置文件是个XML文件,这个文件包含了类信息,描述了如何配置它们,以及如何相互调用。

1三、什么是Spring IOC容器?

答:

Spring IOC负责建立对象,管理对象(经过依赖注入(DI),装配对象,配置对象,而且管理这些对象的整个生命周期。

1四、IOC的优势是什么?

答:

IOC或依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试再也不须要单例和JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。

1五、ApplicationContext一般的实现是什么?

答:

FileSystemXmlApplicationContext :此容器从一个XML文件中加载beans的定义,XML Bean配置文件的全路径名必须提供给它的构造函数。

ClassPathXmlApplicationContext:此容器也从一个XML文件中加载beans的定义,这里,你须要正确设置classpath由于这个容器将在classpath里找 bean 配置。

 WebXmlApplicationContext:此容器加载一个XML文件,此文件定义了一个WEB应用的全部bean。

1六、Bean工厂和Application contexts有什么区别?

答:

Application contexts提供一种方法处理文本消息,一个一般的作法是加载文件资源(好比镜像),它们能够向注册为监听器的 bean发布事件。

另外,在容器或容器内的对象上执行的那些不得不禁bean工厂以程序化方式处理的操做,能够在Application contexts中以声明的方式处理。Application contexts实现了MessageSource接口,该接口的实现以可插拔的方式提供获取本地化消息的方法。

1七、一个Spring的应用看起来像什么?

答:
在这里插入图片描述

依赖注入

一、什么是 Spring的依赖注入?

答:

依赖注入,是IOC的一个方面,是个一般的概念,它有多种解释。这概念是说你不用建立对象,而只须要描述它如何被建立。你不在代码里直接组装你的组件和服务,可是要在配置文件里描述哪些组件须要哪些服务,以后一个容器(IOC 容器)负责把他们组装起来。

二、有哪些不一样类型的IOC(依赖注入)方式?

答:

构造器依赖注入:构造器依赖注入经过容器触发一个类的构造器来实现的,该类有一系列参数,每一个参数表明一个对其余类的依赖。

Setter方法注入:Setter方法注入是容器经过调用无参构造器或无参static工厂 方法实例化bean以后,调用该bean的setter方法,即实现了基于setter的依赖注入。

三、哪一种依赖注入方式你建议使用,构造器注入,仍是Setter 方法注入?

答:

你两种依赖方式均可以使用,构造器注入和Setter方法注入。最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。

Spring Beans

一、什么是Spring beans?

答:

Spring beans是那些造成Spring 应用的主干的java对象。它们被Spring IOC容器初始化,装配和管理。这些beans经过容器中配置的元数据建立。

好比,以XML文件中的形式定义。

Spring框架定义的beans都是单件beans。在bean tag中有个属性”singleton”,若是它被赋为TRUE,bean就是单件,不然就是一个prototypebean。默认是TRUE,因此全部在Spring框架中的beans缺省都是单件。

二、一个Spring Bean定义包含什么?

答:

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

三、如何给Spring容器提供配置元数据?

答:

这里有三种重要的方法给Spring容器提供配置元数据。

XML配置文件。

基于注解的配置。

基于java的配置。

四、你怎样定义类的做用域?

答:

当定义一个在Spring里,咱们还能给这个bean声明一个做用域。它能够经过bean定义中的scope属性来定义。如当Spring要在须要的时候每次生产一个新的bean实例,bean的scope属性被指定为prototype。

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

五、解释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的SpringApplicationContext 情形下有效。

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

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

答:

不,Spring框架中的单例bean不是线程安全的。

七、解释Spring框架中bean的生命周期。

答:

Spring容器从XML文件中读取bean的定义,并实例化 bean。

 Spring根据bean的定义填充全部的属性。

若是bean实现了BeanNameAware接口,Spring传递bean的ID到setBeanName方法。

 若是Bean实现了BeanFactoryAware接口, Spring传递beanfactory给setBeanFactory方法。

 若是有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。

 若是bean 实现IntializingBean了,调用它的afterPropertySet方法,若是bean声明了初始化方法,调用此初始化方法。

 若是有BeanPostProcessors和bean关联,这些bean的postProcessAfterInitialization() 方法将被调用。

 若是bean实现了DisposableBean,它将调用destroy()方法。

八、哪些是重要的bean生命周期方法?你能重载它们吗?

答:

有两个重要的bean生命周期方法,第一个是setup , 它是在容器加载 bean的时候被调用。第二个方法是teardown它是在容器卸载类的时候被调用。

The bean标签有两个重要的属性(init-method和destroy-method)。用它们你能够本身定制初始化和注销方法。它们也有相应的注解(@PostConstruct 和@PreDestroy)。

九、什么是Spring的内部bean?

答:

当一个bean仅被用做另外一个bean的属性时,它能被声明为一个内部bean,为了定义inner bean,在Spring的基于XML的配置元数据中,能够在或元素内使用元素,内部bean一般是匿名的,它们的Scope通常是prototype。

十、在Spring中如何注入一个java集合?

答:

Spring 提供如下几种集合的配置元素:

类型用于注入一列值,容许有相同的值。

 类型用于注入一组值,不容许有相同的值。

 类型用于注入一组键值对,键和值均可觉得任意类型。

 类型用于注入一组键值对,键和值都只能为String类型。

十一、什么是bean装配?

答:

装配,或bean装配是指在Spring容器中把bean组装到一块儿,前提是容器须要知道bean的依赖关系,如何经过依赖注入来把它们装配到一块儿。

十二、什么是bean的自动装配?

答:

Spring容器可以自动装配相互合做的bean,这意味着容器不须要和配置,能经过Bean工厂自动处理bean之间的协做。

1三、解释不一样方式的自动装配。

答:

有五种自动装配的方式,能够用来指导Spring容器用自动装配方式来进行依赖注入。

no:默认的方式是不进行自动装配,经过显式设置ref属性来进行装配。

byName:经过参数名自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,以后容器试图匹配、装配和该bean的属性具备相同名字的bean。

 byType::经过参数类型自动装配,Spring 容器在配置文件中发现bean的autowire属性被设置成byType,以后容器试图匹配、装配和该 bean 的属性具备相同类型的bean。若是有多个bean符合条件,则抛出错误。

 constructor:这个方式相似于byType, 可是要提供给构造器参数,若是没有肯定的带参数的构造器参数类型,将会抛出异常。

 autodetect:首先尝试使用constructor来自动装配,若是没法工做,则使用 byType 方式。

1四、自动装配有哪些局限性 ?

答:

自动装配的局限性是:

重写:你仍需用 和 配置来定义依赖,意味着总要重写自动装配。

 基本数据类型:你不能自动装配简单的属性,如基本数据类型,String字符串,和类。

 模糊特性:自动装配不如显式装配精确,若是有可能,建议使用显式装配。

1五、你能够在Spring中注入一个null和一个空字符串吗?

答:

能够。

Spring注解

一、什么是基于Java的Spring注解配置? 给一些注解的例子

答:

基于Java的配置,容许你在少许的Java注解的帮助下,进行你的大部分Spring配置而非经过XML文件。

以@Configuration注解为例,它用来标记类能够当作一个bean的定义,被Spring IOC容器使用。另外一个例子是@Bean注解,它表示此方法将要返回一个对象,做为一个 bean 注册进Spring应用上下文。

二、什么是基于注解的容器配置?

答:

相对于XML文件,注解型的配置依赖于经过字节码元数据装配组件,而非尖括号的声明。

开发者经过在相应的类,方法或属性上使用注解的方式,直接组件类中进行配置,而不是使用xml表述bean的装配关系。

三、怎样开启注解装配?

答:

注解装配在默认状况下是不开启的,为了使用注解装配,咱们必须在Spring配置文件中配置context:annotation-config/元素。

四、@Required注解

答:

这个注解代表bean的属性必须在配置的时候设置,经过一个bean定义的显式的属性值或经过自动装配,若@Required注解的bean属性未被设置,容器将抛出BeanInitializationException。

五、@Autowired注解

答:

@Autowired注解提供了更细粒度的控制,包括在何处以及如何完成自动装配。它的用法和@Required同样,修饰setter方法、构造器、属性或者具备任意名称和/或多个参数的PN方法。

六、@Qualifier注解

答:

当有多个相同类型的bean却只有一个须要自动装配时,将@Qualifier注解和@Autowire注解结合使用以消除这种混淆,指定须要装配的确切的bean。

Spring数据访问

一、在Spring框架中如何更有效地使用JDBC?

答:

使用SpringJDBC框架,资源管理和错误处理的代价都会被减轻。因此开发者只需写statements和queries从数据存取数据,JDBC也能够在Spring框架提供的模板类的帮助下更有效地被使用,这个模板叫JdbcTemplate(例子见这里here)

二、JdbcTemplate

答:

JdbcTemplate类提供了不少便利的方法解决诸如把数据库数据转变成基本数据类型或对象,执行写好的或可调用的数据库操做语句,提供自定义的数据错误处理。

三、Spring对DAO的支持

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

四、使用Spring经过什么方式访问Hibernate?

答:
在Spring中有两种方式访问Hibernate:

 控制反转Hibernate Template和Callback。

 继承HibernateDAOSupport提供一个AOP拦截器。

五、Spring支持的ORM

答:

Spring 支持如下 ORM:

 Hibernate

 iBatis

 JPA (Java Persistence API)

 TopLink

 JDO (Java Data Objects)

 OJB

六、如何经过HibernateDaoSupport将Spring和Hibernate结合起来?

答:

用Spring的SessionFactory调用LocalSessionFactory。

集成过程分三步:

 配置the Hibernate SessionFactory。

 继承HibernateDaoSupport 实现一个DAO。

 在AOP支持的事务中装配。

七、Spring支持的事务管理类型

答:

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

 编程式事务管理:这意味你经过编程的方式管理事务,给你带来极大的灵活性,可是难维护。

 声明式事务管理:这意味着你能够将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。

八、Spring框架的事务管理有哪些优势?

答:

它为不一样的事务API如JTA,JDBC,Hibernate,JPA和JDO,提供一个不变的编程模式。

 它为编程式事务管理提供了一套简单的API而不是一些复杂的事务API如它支持声明式事务管理。

 它和Spring各类数据访问抽象层很好得集成。

九、你更倾向用那种事务管理类型?

答:

大多数 Spring 框架的用户选择声明式事务管理,由于它对应用代码的影响最小,所以更符合一个无侵入的轻量级容器的思想。声明式事务管理要优于编程式事务管理,虽然比编程式事务管理(这种方式容许你经过代码控制事务)少了一点灵活性。

Spring面向切面编程(AOP)

一、解释AOP

答:

面向切面的编程,或AOP, 是一种编程技术,容许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理。

二、Aspect切面

答:

AOP核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组API提供横切功能。好比,一个日志模块能够被称做日志的AOP切面。根据需求的不一样,一个应用程序能够有若干切面。在Spring AOP中,切面经过带有@Aspect注解的类实现。

三、在Spring AOP中,关注点和横切关注的区别是什么?

答:

关注点是应用中一个模块的行为,一个关注点可能会被定义成一个咱们想实现的一个功能。

横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,好比日志,安全和数据传输,几乎应用的每一个模块都须要的功能。所以这些都属于横切关注点。

四、链接点

答:

链接点表明一个应用程序的某个位置,在这个位置咱们能够插入一个AOP切面,它其实是个应用程序执行Spring AOP的位置。

五、通知

答:

通知是个在方法执行前或执行后要作的动做,其实是程序执行时要经过SpringAOP框架触发的代码段。

Spring切面能够应用五种类型的通知:

 before:前置通知,在一个方法执行前被调用。

 after: 在方法执行以后调用的通知,不管方法执行是否成功。

 after-returning: 仅当方法成功完成后执行的通知。

 after-throwing: 在方法抛出异常退出时执行的通知。

 around: 在方法执行以前和以后调用的通知。

六、切点

答:

切入点是一个或一组链接点,通知将在这些位置执行。能够经过表达式或匹配的方式指明切入点。

七、什么是引入?

答:

引入容许咱们在已存在的类中增长新的方法和属性。

八、什么是目标对象?

答:

被一个或者多个切面所通知的对象。它一般是一个代理对象。也指被通知(advised)对象。

九、什么是代理?

答:

代理是通知目标对象后建立的对象。从客户端的角度看,代理对象和目标对象是同样的。

十、有几种不一样类型的自动代理?

答:

BeanNameAutoProxyCreator

DefaultAdvisorAutoProxyCreator

Metadata autoproxying

十一、什么是织入?什么是织入应用的不一样点?

答:

织入是将切面和到其余应用类型或对象链接或建立一个被通知对象的过程。织入能够在编译时,加载时,或运行时完成。

十二、解释基于XML Schema方式的切面实现。

答:

在这种状况下,切面由常规类以及基于XML的配置实现。

1三、解释基于注解的切面实现

答:

在这种状况下(基于@AspectJ的实现),涉及到的切面声明的风格与带有java5标注的普通java类一致。

Spring的MVC

一、什么是Spring的MVC框架?

答:

Spring配备构建Web应用的全功能MVC框架。Spring能够很便捷地和其余MVC 框架集成,如Struts,Spring的MVC框架用控制反转把业务对象和控制逻辑清晰地隔离。它也容许以声明的方式把请求参数和业务对象绑定。

二、DispatcherServlet

答:

Spring 的 MVC框架是围绕DispatcherServlet来设计的,它用来处理全部的HTTP请求和响应。

三、WebApplicationContext

答:

WebApplicationContext继承了ApplicationContext并增长了一些WEB应用必备的特有功能,它不一样于通常的 ApplicationContext ,由于它能处理主题,并找到被关联的servlet。

四、什么是Spring MVC框架的控制器?

答:

控制器提供一个访问应用程序的行为,此行为一般经过服务接口实现。控制器解析用户输入并将其转换为一个由视图呈现给用户的模型。Spring用一个很是抽象的方式实现了一个控制层,容许用户建立多种用途的控制器。

五、@Controller注解

答:

该注解代表该类扮演控制器的角色,Spring不须要你继承任何其余控制器基类或引用Servlet API。

六、@RequestMapping注解

答:

该注解是用来映射一个URL到一个类或一个特定的方处理法上。

总结

该面试题答案解析完整文档获取方式:Spring面试题总结