Spring

Spring容器

Spring容器是Spring框架最核心的部分,它管理着Spring应用中bean的创建、配置和管理。

Spring容器使用DI(Dependency Injection)管理构成应用的组件,它会创建相互协作的组件之间的关联。

Spring自带了多个容器实现,可归为两个不同的类型。

  1. bean工厂,由org.springframework.beans.factory.BeanFactory接口定义。

  2. 基于BeanFactory构建的并提供应用框架级别服务的应用上下文,由org.springframework.context.ApplicationContext接口定义。

Spring应用上下文

在Spring中的应用上下文都是实现ApplicationContext接口的。

Spring框架自带了多种类型的应用上下文。

  • AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载Spring应用上下文。

  • ClassPathXmlApplicationContext:从类路径下的一个或多个XML配置文件中加载Spring应用上下文定义。

  • FileSystemXmlApplicationContext:从文件系统下的一个或多个XML配置文件中加载Spring应用上下文定义。

Spring Web框架自带了多种类型的应用上下文。

  • AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类中加载Spring Web应用上下文。

  • XmlWebApplicationContext从一个或多个XML配置文件中加载Spring Web应用上下文定义。

bean的生命周期

  1. Spring对bean进行实例化。

  2. Spring将值和bean的引用注入到bean对应的属性中。

  3. 若bean实现了BeanNameAware接口,Spring将调用其setBeanName()并传入bean的ID。

  4. 若bean实现了BeanFactoryAware接口,Spring将调用其setBeanFactory()并传入BeanFactory容器实例。

  5. 若bean实现了ApplicationContextAware接口,Spring将调用其setApplicationContext()并传入bean所在的应用上下文实例。

  6. 若bean实现了BeanPostProcessor接口,Spring将调用其postProcessBeforeInitialization()

  7. 若bean实现了InitializingBean接口,Spring将调用其afterPropertiesSet()。而且,若bean使用init-method等方式声明了初始化方法,该自定义的初始化方法会被调用。

  8. 若bean实现了BeanPostProcessor接口,Spring将调用其postProcessAfterInitialization()

  9. 此时,bean已准备就绪,可被应用程序使用。这个bean会一直驻留在应用上下文中,直到该应用上下文被销毁。

  10. 当bean被销毁时,若bean实现了DisposableBean接口,Spring将调用其destroy()。而且,若bean使用destroy-method等方式声明了销毁方法,该自定义的销毁方法会被调用。

创建Spring项目

遵循Kotlin/Gradle规范组织Spring项目的目录结构。

learnspring
├── build.gradle
├── settings.gradle
└── src
    ├── main
    │   ├── kotlin
    │   │   └── tech
    │   │       └── daking
    │   └── resources
    └── test
        ├── kotlin
        │   └── tech
        │       └── daking
        └── resources
1
2
3
4
5
6
7
8
9
10
11
12
13
14

settings.gradle文件的内容如下。

rootProject.name = 'learnspring'
1

build.gradle文件的内容如下。

buildscript {
    ext.kotlin_version = '1.2.21'
    ext.spring_version = '4.3.16.RELEASE'

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

group 'tech.daking'
version '1.0.0'

apply plugin: 'java'
apply plugin: 'kotlin'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    testCompile group: 'junit', name: 'junit', version: '4.12'

    testCompile "org.springframework:spring-test:$spring_version"
    compile "org.springframework:spring-core:$spring_version"
    compile "org.springframework:spring-context:$spring_version"
    compile "org.springframework:spring-beans:$spring_version"
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40