Spring的相关问题

一、一般问题

1.什么是 Spring Framework 有什么优点 ?

是一个轻量级框架,用来降低应用程序的复杂度,采用分层结构,允许用户选择组件,比如 mybatis 等等,支持POJO编程,从而具备持续集成和可测试性。

2.Spring Framework有什么功能?

IOC —— 控制反转。

AOP —— 面向切面编程可以将业务逻辑和系统服务分离,以实现高内聚。

容器 —— Spring负责创建和管理对象(Bean)的生命周期和配置。

事务管理 —— 提供了用于事务管理的通用抽象层。

JDBC异常 —— Spring 的 JDBC 抽象层提供了一个异常层次结构,简化了错误处理策略。

3.Spring Framework有多少个模块,作用分别是什么?

Spring 核心容器 - 该层是Spring Framework 的核心 :Spring Core、Spring Bean、SpEL、Spring Context。

数据访问/集成 - 该层提供与数据库交互的支持:JDBC、ORM、OXM、JMS、Transcation。

Web - 该层提供了创建 Web 应用程序的支持:Web、Web-Servlet、Web-Socket、Web-Portlet。

AOP - 该层支持面向切面编程。

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

Test - 该层为使用JUnit和TestNG进行测试提供支持。

几个杂项模块:

Messaging - 该模块为STOMP提供支持。它还支持注解编程模型,该模型用于从WebSocket客户端路由和处理STOPMP消息。STOMP:简单(流)文本定向消息协议,它提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互。

Aspects - 该模型为与AspecrJ的继承提供支持。

4.什么是Spring配置文件

Spring配置文件是XML文件。该文件主要包含类信息。它描述这些类是如何配置以及相互引用的。

二、依赖注入

1.什么是 Spring Ioc 容器

Spring 框架的核心是 Spring 容器。容器创建对象,将他们装配到一起,配置他们并管理他们的完整生命周期。Spring 容器使用依赖注入来管理组成依赖注入的组件。

容器通过读取提供的配置元数据来接收对象进行实例化,配置和组装的指令。该元数据可以通过XML、Java注解或Java代码提供。

2.什么是依赖注入

在依赖注入中,不需要自己创建对象,但必须描述如何创建,并且描述配置文件中哪些组件需要哪些服务。由IOC容器将它们装配在一起。

3.可以通过哪些方式完成依赖注入

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

  • *构造函数注入

  • *setter 注入

  • *接口注入

4.Spring 中有多少种IOC容器

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

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

5.两种容器的区别

 
BeanFactory ApplicationContext
它使用懒加载 它使用即时加载
它使用语法显式提供资源对象 它自己创建和管理资源对象
不支持国际化 支持国际化
不支持基于依赖的注解 支持基于依赖的注解

6.IOC的好处

最小化应用程序中的代码量

使应用程序易于测试,因为不需要单元测试中实例化任何类

松耦合

支持即时实例化和延迟加载

7.IOC实现机制

工厂模式加反射 根据类名创建类的实例化

三、Beans

1.什么时Spring Bean

构成用户应用程序主干的对象

Bean由Spring IOC 容器实例化,配置,装配和管理

Bean是基于用户提供给容器的配置元数据创建

2.Spring 提供了哪些配置方式

基于xml配置

<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 来实现。

  1. @Bean 注解扮演与 元素相同的角色。

  2. @Configuration 类允许通过简单地调用同一个类中的其他 @Bean 方法来定义 bean 间依赖关系。

例如:

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

3.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 所共享。在 global session 作用域中定义的 bean 被限定于全局 portlet Session 的生命周期范围内。如果你在 web 中使用 global session 作用域来标识 bean,那么 web 会自动当成 session 类型来使用。

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

4.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 方法( 的 init-method 属性),那么将调用它。

  7. 最后,如果存在与 bean 关联的任何 BeanPostProcessors,则将调用 postProcessAfterInitialization() 方法。

  8. 如果 bean 实现 DisposableBean 接口,当 spring 容器关闭时,会调用 destory()。

  9. 如果为 bean 指定了 destroy 方法( 的 destroy-method 属性),那么将调用它。

5.什么是 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 自动装配。

局限:

  • 覆盖的可能性 - 您始终可以使用 和 设置指定依赖项,这将覆盖自动装配。

  • 基本元数据类型 - 简单属性(如原数据类型,字符串和类)无法自动装配。

  • 令人困惑的性质 - 总是喜欢使用明确的装配,因为自动装配不太精确。

四、注解

1.你用过哪些注解

  • @Controller - 用于 Spring MVC 项目中的控制器类。

  • @Service - 用于服务类。

  • @RequestMapping - 用于在控制器处理程序方法中配置 URI 映射。

  • @ResponseBody - 用于发送 Object 作为响应,通常用于发送 XML 或 JSON 数据作为响应。

  • @PathVariable - 用于将动态值从 URI 映射到处理程序方法参数。

  • @Autowired - 用于在 spring bean 中自动装配依赖项。

  • @Qualifier - 使用 @Autowired 注解,以避免在存在多个 bean 类型实例时出现混淆。

  • @Scope - 用于配置 spring bean 的范围。

  • @Configuration,@ComponentScan 和 @Bean - 用于基于 java 的配置。

  • @Aspect,@Before,@After,@Around,@Pointcut - 用于切面编程(AOP)。

2.@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。 

posted @ 2020-01-03 15:03  皮肤黝黑的小白  阅读(94)  评论(0)    收藏  举报