下面总结了 Spring 面试 7 大问题,看你能顶得住不?前端
1.1. 不一样版本的 Spring Framework 有哪些主要功能?java
1.2. 什么是 Spring Framework?git
Spring 是一个开源应用框架,旨在下降应用程序开发的复杂度。github
它是轻量级、松散耦合的。web
它具备分层体系结构,容许用户选择组件,同时还为 J2EE 应用程序开发提供了一个有凝聚力的框架。面试
它能够集成其余框架,如 Structs、Hibernate、EJB 等,因此又称为框架的框架。正则表达式
1.3. 列举 Spring Framework 的优势。spring
因为 Spring Frameworks 的分层架构,用户能够自由选择本身须要的组件。数据库
Spring Framework 支持 POJO(Plain Old Java Object) 编程,从而具有持续集成和可测试性。编程
因为依赖注入和控制反转,JDBC 得以简化。
它是开源免费的。
1.4. Spring Framework 有哪些不一样的功能?
轻量级 - Spring 在代码量和透明度方面都很轻便。
IOC - 控制反转
AOP - 面向切面编程能够将应用业务逻辑和系统服务分离,以实现高内聚。
容器 - Spring 负责建立和管理对象(Bean)的生命周期和配置。
MVC - 对 web 应用提供了高度可配置性,其余框架的集成也十分方便。
事务管理 - 提供了用于事务管理的通用抽象层。Spring 的事务支持也可用于容器较少的环境。
JDBC 异常 - Spring 的 JDBC 抽象层提供了一个异常层次结构,简化了错误处理策略。
1.5. Spring Framework 中有多少个模块,它们分别是什么?
Spring 核心容器 – 该层基本上是 Spring Framework 的核心。它包含如下模块:
数据访问/集成 – 该层提供与数据库交互的支持。它包含如下模块:
Web – 该层提供了建立 Web 应用程序的支持。它包含如下模块:
AOP – 该层支持面向切面编程
Instrumentation – 该层为类检测和类加载器实现提供支持。
Test – 该层为使用 JUnit 和 TestNG 进行测试提供支持。
几个杂项模块:
1.6. 什么是 Spring 配置文件?
Spring 配置文件是 XML 文件。该文件主要包含类信息。它描述了这些类是如何配置以及相互引入的。可是,XML 配置文件冗长且更加干净。若是没有正确规划和编写,那么在大项目中管理变得很是困难。
1.7. Spring 应用程序有哪些不一样组件?
Spring 应用通常有如下组件:
接口 - 定义功能。
Bean 类 - 它包含属性,setter 和 getter 方法,函数等。
Spring 面向切面编程(AOP) - 提供面向切面编程的功能。
Bean 配置文件 - 包含类的信息以及如何配置它们。
用户程序 - 它使用接口。
1.8. 使用 Spring 有哪些方式?
使用 Spring 有如下方式:
2.1. 什么是 Spring IOC 容器?
Spring 框架的核心是 Spring 容器。容器建立对象,将它们装配在一块儿,配置它们并管理它们的完整生命周期。Spring 容器使用依赖注入来管理组成应用程序的组件。
容器经过读取提供的配置元数据来接收对象进行实例化,配置和组装的指令。该元数据能够经过 XML,Java 注解或 Java 代码提供。
2.2. 什么是依赖注入?
在依赖注入中,您没必要建立对象,但必须描述如何建立它们。您不是直接在代码中将组件和服务链接在一块儿,而是描述配置文件中哪些组件须要哪些服务。由 IoC 容器将它们装配在一块儿。
2.3. 能够经过多少种方式完成依赖注入?
一般,依赖注入能够经过三种方式完成,即:
在 Spring Framework 中,仅使用构造函数和 setter 注入。
2.4. 区分构造函数注入和 setter 注入。
构造函数注入
setter 注入
没有部分注入
有部分注入
不会覆盖 setter 属性
会覆盖 setter 属性
任意修改都会建立一个新实例
任意修改不会建立一个新实例
适用于设置不少属性
适用于设置少许属性
2.5. spring 中有多少种 IOC 容器?
2.6. 区分 BeanFactory 和 ApplicationContext。
2.7. 列举 IoC 的一些好处。
IoC 的一些好处是:
2.8. Spring IoC 的实现机制。
Spring 中的 IoC 的实现原理就是工厂模式加反射机制。Spring的核心思想,总结得很是好,推荐你们看下。
示例:
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(); } } }
3.1. 什么是 spring bean?
3.2. spring 提供了哪些配置方式?
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>
Spring 的 Java 配置是经过使用 @Bean 和 @Configuration 来实现。
例如:
@Configuration public class StudentConfig { @Bean public StudentBean myStudent() { return new StudentBean(); } }
3.3. spring 支持集中 bean scope?
Spring bean 支持 5 种 scope:
仅当用户使用支持 Web 的 ApplicationContext 时,最后三个才可用。这篇推荐看下:Spring bean scope详解。关注微信公众号:Java技术栈,在后台回复:spring,能够获取我整理的 N 篇最新Spring 教程,都是干货。
3.4. spring bean 容器的生命周期是什么样的?
spring bean 容器的生命周期流程以下:
3.5. 什么是 spring 的内部 bean?
只有将 bean 用做另外一个 bean 的属性时,才能将 bean 声明为内部 bean。为了定义 bean,Spring 的基于 XML 的配置元数据在 <property> 或 <constructor-arg> 中提供了 <bean> 元素的使用。内部 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>
3.6. 什么是 spring 装配
当 bean 在 Spring 容器中组合在一块儿时,它被称为装配或 bean 装配。Spring 容器须要知道须要什么 bean 以及容器应该如何使用依赖注入来将 bean 绑定在一块儿,同时装配 bean。
3.7. 自动装配有哪些方式?
Spring 容器可以自动装配 bean。也就是说,能够经过检查 BeanFactory 的内容让 Spring 自动解析 bean 的协做者。
自动装配的不一样模式:
3.8. 自动装配有什么局限?
4.1. 你用过哪些重要的 Spring 注解?
关注微信公众号:Java技术栈,在后台回复:spring,能够获取我整理的 N 篇最新Spring 教程,都是干货。
4.2. 如何在 spring 中启动注解装配?
默认状况下,Spring 容器中未打开注解装配。所以,要使用基于注解装配,咱们必须经过配置<context:annotation-config /> 元素在 Spring 配置文件中启用它。
4.3. @Component, @Controller, @Repository, @Service 有何区别?
4.4. @Required 注解有什么用?
@Required 应用于 bean 属性 setter 方法。此注解仅指示必须在配置时使用 bean 定义中的显式属性值或使用自动装配填充受影响的 bean 属性。若是还没有填充受影响的 bean 属性,则容器将抛出 BeanInitializationException。
示例:
public class Employee { private String name; @Required public void setName(String name){ this.name=name; } public string getName(){ return name; } }
4.5. @Autowired 注解有什么用?
@Autowired 能够更准确地控制应该在何处以及如何进行自动装配。此注解用于在 setter 方法,构造函数,具备任意名称或多个参数的属性或方法上自动装配 bean。默认状况下,它是类型驱动的注入。
public class Employee { private String name; @Autowired public void setName(String name) { this.name=name; } public string getName(){ return name; } }
4.6. @Qualifier 注解有什么用?
当您建立多个相同类型的 bean 并但愿仅使用属性装配其中一个 bean 时,您可使用@Qualifier 注解和 @Autowired 经过指定应该装配哪一个确切的 bean 来消除歧义。
例如,这里咱们分别有两个类,Employee 和 EmpAccount。在 EmpAccount 中,使用@Qualifier 指定了必须装配 id 为 emp1 的 bean。
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); } }
4.7. @RequestMapping 注解有什么用?
@RequestMapping 注解用于将特定 HTTP 请求方法映射到将处理相应请求的控制器中的特定类/方法。Spring MVC经常使用注解,推荐看下。
此注解可应用于两个级别:
5.1. spring DAO 有什么用?
Spring DAO 使得 JDBC,Hibernate 或 JDO 这样的数据访问技术更容易以一种统一的方式工做。这使得用户容易在持久性技术之间切换。它还容许您在编写代码时,无需考虑捕获每种技术不一样的异常。
5.2. 列举 Spring DAO 抛出的异常。
5.3. spring JDBC API 中存在哪些类?
5.4. 使用 Spring 访问 Hibernate 的方法有哪些?
咱们能够经过两种方式使用 Spring 访问 Hibernate:
5.5. 列举 spring 支持的事务管理类型
Spring 支持两种类型的事务管理:
5.6. spring 支持哪些 ORM 框架
6.1. 什么是 AOP?
AOP(Aspect-Oriented Programming), 即 面向切面编程, 它与 OOP( Object-Oriented Programming, 面向对象编程) 相辅相成, 提供了与 OOP 不一样的抽象软件结构的视角。
在 OOP 中, 咱们以类(class)做为咱们的基本单元, 而 AOP 中的基本单元是 Aspect(切面)
6.2. AOP 中的 Aspect、Advice、Pointcut、JointPoint 和 Advice 参数分别是什么?
6.3. 什么是通知(Advice)?
特定 JoinPoint 处的 Aspect 所采起的动做称为 Advice。Spring AOP 使用一个 Advice 做为拦截器,在 JoinPoint “周围”维护一系列的拦截器。
6.4. 有哪些类型的通知(Advice)?
6.5. 指出在 spring aop 中 concern 和 cross-cutting concern 的不一样之处。
concern 是咱们想要在应用程序的特定模块中定义的行为。它能够定义为咱们想要实现的功能。
cross-cutting concern 是一个适用于整个应用的行为,这会影响整个应用程序。例如,日志记录,安全性和数据传输是应用程序几乎每一个模块都须要关注的问题,所以它们是跨领域的问题。
6.6. AOP 有哪些实现方式?
实现 AOP 的技术,主要分为两大类:
6.7. Spring AOP and AspectJ AOP 有什么区别?
Spring AOP 基于动态代理方式实现;AspectJ 基于静态代理方式实现。
Spring AOP 仅支持方法级别的 PointCut;提供了彻底的 AOP 支持,它还支持属性级别的 PointCut。
6.8. 如何理解 Spring 中的代理?
将 Advice 应用于目标对象后建立的对象称为代理。在客户端对象的状况下,目标对象和代理对象是相同的。详解 Java 中的三种代理模式,这篇看下。
Advice + Target Object = Proxy
6.9. 什么是编织(Weaving)?
为了建立一个 advice 对象而连接一个 aspect 和其它应用类型或对象,称为编织(Weaving)。在 Spring AOP 中,编织在运行时执行。请参考下图:
7.1. Spring MVC 框架有什么用?
Spring Web MVC 框架提供 模型-视图-控制器 架构和随时可用的组件,用于开发灵活且松散耦合的 Web 应用程序。
MVC 模式有助于分离应用程序的不一样方面,如输入逻辑,业务逻辑和 UI 逻辑,同时在全部这些元素之间提供松散耦合。
7.2. 描述一下 DispatcherServlet 的工做流程
DispatcherServlet 的工做流程能够用一幅图来讲明:
5.Handler(Controller)执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象;
6.根据返回的ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到 Spring 容器中的ViewResolver)返回给DispatcherServlet。
7.ViewResolver 结合Model和View,来渲染视图。
8.视图负责将渲染结果返回给客户端。
7.3. 介绍一下 WebApplicationContext
WebApplicationContext 是 ApplicationContext 的扩展。它具备 Web 应用程序所需的一些额外功能。它与普通的 ApplicationContext 在解析主题和决定与哪一个 servlet 关联的能力方面有所不一样。
参考资料:
https://www.edureka.co/blog/i...https://www.journaldev.com/26...
做者:静默虚空
juejin.im/post/5cbda379f265da03ae74c282
推荐去个人博客阅读更多:
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
生活很美好,明天见~