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 来实现。
-
@Bean 注解扮演与 元素相同的角色。
-
@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 容器的生命周期流程如下:
-
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 属性),那么将调用它。
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。

浙公网安备 33010602011771号