1.一般问题
不同版本的 Spring Framework 有哪些主要功能?

Version

Feature

Spring 2.5

发布于2007年。这是第一个支持注解的版本

Spring 3.0

发布于 2009 年,它完全利用了 Java5中的改进,并为 JEE6提供了支持。

Spring 4.0

发布于2013年。这是第一个完全支持 JAVA8 的版本

什么是 Spring Framework?
Spring 是一个开源应用框架,旨在降低应用程序开发的复杂度。它是轻量级、松散耦合的。它具有分层体系架构,允许用户选择组件,同时还为 J2EE 应用程序开发提供了一个有凝聚力的框架,它可以集成其他框架,如 Structs、Hibernate、EJB等,所以又称为框架的框架。

列举 Spring Frameworks 的优点
由于Spring Frameworks 的分层架构,用户可以自由选择自己需要的组件。Framework 支持 POJO(Plain Old Java Object)编程,从而具备持续集成和可测试性。由于依赖注入和控制反转,JDBC 得以简化。它是开源免费的。

Spring Framework 有哪些不同的功能?
轻量级-Spring 在代码量和透明度方面都很轻便。IOC-控制反转,AOP-面向切面编程,可以将应用业务逻辑和系统服务分离,以实现高内聚。容器-Spring 负责创建和管理对象( bean )的生命周期和配置。MVC-对 Web 应用提供了高度可配置性,其他框架的集成也十分方便。事务管理-提供了用于事务的通用抽象层。Spring 的事务支持也可用于容器较少的环境。JDBC 异常-Spring 的 JDBC 抽象层提供了一个异常层次结构,简化了错误处理策略。

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

spring 除了java还有什么语言_java


Spring 核心容器-该层基本上是 Spring Framework 的核心。它包含以下模块:

  • Spring Core
  • Spring Bean
  • SpEL(Spring Expression Language)
  • Spring Context

数据访问/集成-该层提供与数据库交互的支持。它包含以下模块:

  • JDBC(Java DataBase Connectivity)
  • ORM(Object Relational Mapping)
  • OXM(Object XML Mappers)
  • JMS(Java Messaging Service)
  • Transactions

Web-该层提供了创建 Web 应用程序的支持。它包含以下模块:

  • Web
  • Web-Servlet
  • Web-Socket
  • Web-Portlet

AOP

  • 该层支持面向切面编程

Instrumentation

  • 该层为类检测和类加载器实现提供支持

Test

  • 该层为 JUnit 和 TestNG 进行测试提供支持

几个杂项模块:

  • Messaging-该模块为 STOMP 提供支持,它还支持注解编程模型,该模型用于从 WebSocket 客户端路由和处理 STOMP 消息
  • Aspects-该模块为与 AspectJ 的集成提供支持。

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

Spring 应用程序有哪些不同组件?
Spring 应用一般有以下组件:

  • 接口-定义功能
  • Bean 类,它包含属性,setter 和 getter 方法,函数等。
  • Spring 面向切面编程(AOP)-提供面向切面编程的功能
  • Bean 配置文件-包含类的信息以及如何配置它们。
  • 用户程序-它使用接口

使用 Spring 有那些方式?
使用 Spring 有以下方式:

  • 作为一个成熟的 Spring Web 应用程序。
  • 作为第三方 Web 框架,使用 Frameworks 中间层
  • 用于远程使用
  • 作为企业级 Java Bean,它可以包装现有的 POJO(Plain Old Java Objects)

2.依赖注入(IoC)

什么是Spring IoC 容器?

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

spring 除了java还有什么语言_Web_02


什么是依赖注入?

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

可以通过多少种方式完成依赖注入?
通常依赖注入可以通过三种方式完成,即:

  • 构造函数注入
  • setter 注入
  • 接口注入
    在 Spring Framework 仅使用构造函数和 Setter 注入

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

构造函数注入

setter 注入

没有部分注入

有部分注入

不会覆盖 setter 属性

会覆盖 setter 属性

任意修改都会创建一个新实例

任意修改都不会创建一个实例

适用于设置很多属性

适用于设置少量属性

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

区分 BeanFactory 和 ApplicationContext

BeanFactory

ApplicationContext

它使用懒加载

它使用即时加载

它使用语法显示提供资源对象

它自己创建和管理资源对象

不支持国际化

支持国际化

不支持基于依赖的注解

支持基于依赖的注解

列举 IoC 的一些好处
IoC 的一些好处是:

  • 它将最少化应用程序中的代码量
  • 它将使你的应用程序易于测试,因为它不需要单元测试用例中的任何单例或 JNDI 查找机制。
  • 它以最小的影响和最少的侵入机制促进松耦合
  • 它支持即时的实例化和延迟加载任务

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) { 
f=Factory.getInstance("io.github.dunwu.spring.Apple"); if(f!=null){
  f.eat(); 
  } 
 } 
}

3.Beans
什么是 Spring Bean?

  • 它们是构成用户应用程序主干的对象。
  • Bean 由 Spring IoC 容器管理。
  • 它们由 Spring IoC 容器实例化,配置、装配和管理。
  • 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 注解扮演与 < bean/> 元素相同的角色。
  • @Configuration 类允许通过简单的调用同一个类中的其他 @Bean 方法来定义 bean 间依赖关系。例:
    如:
@Configuration 
public class StudentConfig {
 @Bean 
 public StudentBean myStudent() {
  return new StudentBean();
  } 
}

Spring 支持集中 bean scope?
Spring 支持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 所共享。在 global session 作用域中定义的 bean 被限定于全局 portlet session 的生命周期范围内。如果你在 web 中使用 global session 作用域来标识 bean ,那么Web 会自动当成session 类型来完成。
仅当用户使用支持 Web 的 ApplicatioContext 时,最后三个才可用。

Spring bean 容器的生命周期是什么样的?
Spring bean 容器的生命周期的流程:
1) Spring 容器根据配置中的 bean 定义实例化 bean 。
2) Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置。
3) 如果 bean 实现 BeanNameAware 接口,则工厂通过传递 bean 的 ID 来调用 setBeanName()。
4)如果 bean 实现 BeanFactoryAware 接口,工厂通过传递自身的实例来调用 setBeanFactory()。
5)如果存在与 bean 关联的任何 BeanPostProcessors,则调用 PreProcessBeforeInitialization() 方法。
6)如果为 bean 指定了 init 方法(< bean> 的 init-method 属性),那么将调用它。
7)如果存在与 bean 关联的任何 BeanPostProcessors,则调用 PreProcessAfterInitialization() 方法。
8)如果 bean 实现 DisposableBean 接口,当 Spring 容器关闭时,会调用 destory()。
9)如果为 bean 指定了 destory()方法(< bean> 的 destroy-method 属性),那么将调用它。