目录
1. 一般问题
1.1. 不同版本的 Spring Framework 有哪些主要功能?
1.2. 什么是 Spring Framework?
1.3. 列举 Spring Framework 的优点。
1.4. Spring Framework 有哪些不同的功能?
1.5. Spring Framework 中有多少个模块,它们分别是什么?
1.6. 什么是 Spring 配置文件?
1.7. Spring 应用程序有哪些不同组件?
1.8. 使用 Spring 有哪些方式?
2. 依赖注入(Ioc)
2.1. 什么是 Spring IOC 容器?
2.2. 什么是依赖注入?
2.3. 可以通过多少种方式完成依赖注入?
2.4. 区分构造函数注入和 setter 注入。
2.5. spring 中有多少种 IOC 容器?
2.6. 区分 BeanFactory 和 ApplicationContext。
2.7. 列举 IoC 的一些好处。
2.8. Spring IoC 的实现机制。
3. Beans
3.1. 什么是 spring bean?
3.2. spring 提供了哪些配置方式?
基于 xml 配置
基于注解配置
基于 Java API 配置
3.3. spring 支持集中 bean scope?
3.4. spring bean 容器的生命周期是什么样的?
3.5. 什么是 spring 的内部 bean?
3.6. 什么是 spring 装配
3.7. 自动装配有哪些方式?
3.8. 自动装配有什么局限?
4. 注解
4.1. 什么是基于注解的容器配置
4.2. 如何在 spring 中启动注解装配?
4.3. @Component, @Controller, @Repository, @Service 有何区别?
4.4. @Required 注解有什么用?
4.5. @Autowired 注解有什么用?
4.6. @Qualifier 注解有什么用?
4.7. @RequestMapping 注解有什么用?
5. 数据访问
5.1. spring DAO 有什么用?
5.2. 列举 Spring DAO 抛出的异常。
5.3. spring JDBC API 中存在哪些类?
5.4. 使用 Spring 访问 Hibernate 的方法有哪些?
5.5. 列举 spring 支持的事务管理类型
5.6. spring 支持哪些 ORM 框架
6. AOP
6.1. 什么是 AOP?
6.2. 什么是 Aspect?
6.3. 什么是切点(JoinPoint)
6.4. 什么是通知(Advice)?
6.5. 有哪些类型的通知(Advice)?
6.6. 指出在 spring aop 中 concern 和 cross-cutting concern 的不同之处。
6.7. AOP 有哪些实现方式?
6.8. Spring AOP and AspectJ AOP 有什么区别?
6.9. 如何理解 Spring 中的代理?
6.10. 什么是编织(Weaving)?
7. MVC
7.1. Spring MVC 框架有什么用?
7.2. 描述一下 DispatcherServlet 的工作流程
7.3. 介绍一下 WebApplicationContext
Spring 核心容器 – 该层基本上是 Spring Framework 的核心。它包含以下模块:
数据访问/集成 – 该层提供与数据库交互的支持。它包含以下模块:
Web – 该层提供了创建 Web 应用程序的支持。它包含以下模块:
AOP – 该层支持面向切面编程
Instrumentation – 该层为类检测和类加载器实现提供支持。
Test – 该层为使用 JUnit 和 TestNG 进行测试提供支持。
几个杂项模块:
Spring 配置文件是 XML 文件。该文件主要包含类信息。它描述了这些类是如何配置以及相互引入的。但是,XML 配置文件冗长且更加干净。如果没有正确规划和编写,那么在大项目中管理变得非常困难。
Spring 应用一般有以下组件:
使用 Spring 有以下方式:
Spring 框架的核心是 Spring 容器。容器创建对象,将它们装配在一起,配置它们并管理它们的完整生命周期。Spring 容器使用依赖注入来管理组成应用程序的组件。容器通过读取提供的配置元数据来接收对象进行实例化,配置和组装的指令。该元数据可以通过 XML,Java 注解或 Java 代码提供。
在依赖注入中,您不必创建对象,但必须描述如何创建它们。您不是直接在代码中将组件和服务连接在一起,而是描述配置文件中哪些组件需要哪些服务。由 IoC 容器将它们装配在一起。
通常,依赖注入可以通过三种方式完成,即:
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();
}
}
}
bean 所需的依赖项和服务在 XML 格式的配置文件中指定。这些配置文件通常包含许多 bean 定义和特定于应用程序的配置选项。它们通常以 bean 标签开头。例如:
您可以通过在相关的类,方法或字段声明上使用注解,将 bean 配置为组件类本身,而不是使用 XML 来描述 bean 装配。默认情况下,Spring 容器中未打开注解装配。因此,您需要在使用它之前在 Spring 配置文件中启用它。例如:
Spring 的 Java 配置是通过使用 @Bean 和 @Configuration 来实现。
@Bean 注解扮演与
@Configuration 类允许通过简单地调用同一个类中的其他 @Bean 方法来定义 bean 间依赖关系。
例如:
@Configuration
public class StudentConfig {
@Bean
public StudentBean myStudent() {
return new StudentBean();
}
}
Spring bean 支持 5 种 scope:
仅当用户使用支持 Web 的 ApplicationContext 时,最后三个才可用。
spring bean 容器的生命周期流程如下:
只有将 bean 用作另一个 bean 的属性时,才能将 bean 声明为内部 bean。为了定义 bean,Spring 的基于 XML 的配置元数据在
例如,假设我们有一个 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 在 Spring 容器中组合在一起时,它被称为装配或 bean 装配。 Spring 容器需要知道需要什么 bean 以及容器应该如何使用依赖注入来将 bean 绑定在一起,同时装配 bean。
Spring 容器能够自动装配 bean。也就是说,可以通过检查 BeanFactory 的内容让 Spring 自动解析 bean 的协作者。
自动装配的不同模式:
令人困惑的性质 - 总是喜欢使用明确的装配,因为自动装配不太精确。
不使用 XML 来描述 bean 装配,开发人员通过在相关的类,方法或字段声明上使用注解将配置移动到组件类本身。它可以作为 XML 设置的替代方案。例如:
Spring 的 Java 配置是通过使用 @Bean 和 @Configuration 来实现。
@Bean 注解扮演与 元素相同的角色。
@Configuration 类允许通过简单地调用同一个类中的其他 @Bean 方法来定义 bean 间依赖关系。
例如:
@Configuration
public class StudentConfig {
@Bean
public StudentBean myStudent() {
return new StudentBean();
}
}
默认情况下,Spring 容器中未打开注解装配。因此,要使用基于注解装配,我们必须通过配置
@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;
}
}
@Autowired 可以更准确地控制应该在何处以及如何进行自动装配。此注解用于在 setter 方法,构造函数,具有任意名称或多个参数的属性或方法上自动装配 bean。默认情况下,它是类型驱动的注入。
public class Employee {
private String name;
@Autowired
public void setName(String name) {
this.name=name;
}
public string getName(){
return name;
}
}
当您创建多个相同类型的 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 注解用于将特定 HTTP 请求方法映射到将处理相应请求的控制器中的特定类/方法。此注释可应用于两个级别:
Spring DAO 使得 JDBC,Hibernate 或 JDO 这样的数据访问技术更容易以一种统一的方式工作。这使得用户容易在持久性技术之间切换。它还允许您在编写代码时,无需考虑捕获每种技术不同的异常。
我们可以通过两种方式使用 Spring 访问 Hibernate:
Spring 支持两种类型的事务管理:
AOP(Aspect-Oriented Programming), 即 面向切面编程, 它与 OOP( Object-Oriented Programming, 面向对象编程) 相辅相成, 提供了与 OOP 不同的抽象软件结构的视角.
在 OOP 中, 我们以类(class)作为我们的基本单元, 而 AOP 中的基本单元是 Aspect(切面)
aspect 由 pointcount 和 advice 组成, 它既包含了横切逻辑的定义, 也包括了连接点的定义. Spring AOP 就是负责实施切面的框架, 它将切面所定义的横切逻辑编织到切面所指定的连接点中.
AOP 的工作重心在于如何将增强编织目标对象的连接点上, 这里包含两个工作:
如何通过 pointcut 和 advice 定位到特定的 joinpoint 上
如何在 advice 中编写切面代码.
可以简单地认为, 使用 @Aspect 注解的类就是切面.
程序运行中的一些时间点, 例如一个方法的执行, 或者是一个异常的处理.
在 Spring AOP 中, join point 总是方法的执行点。
特定 JoinPoint 处的 Aspect 所采取的动作称为 Advice。Spring AOP 使用一个 Advice 作为拦截器,在 JoinPoint “周围”维护一系列的拦截器。
实现 AOP 的技术,主要分为两大类:
将 Advice 应用于目标对象后创建的对象称为代理。在客户端对象的情况下,目标对象和代理对象是相同的。
Advice + Target Object = Proxy
为了创建一个 advice 对象而链接一个 aspect 和其它应用类型或对象,称为编织(Weaving)。在 Spring AOP 中,编织在运行时执行。请参考下图:
Spring Web MVC 框架提供 模型-视图-控制器 架构和随时可用的组件,用于开发灵活且松散耦合的 Web 应用程序。 MVC 模式有助于分离应用程序的不同方面,如输入逻辑,业务逻辑和 UI 逻辑,同时在所有这些元素之间提供松散耦合。
DispatcherServlet 的工作流程:
WebApplicationContext 是 ApplicationContext 的扩展。它具有 Web 应用程序所需的一些额外功能。它与普通的 ApplicationContext 在解析主题和决定与哪个 servlet 关联的能力方面有所不同。