Spring(一):概览

2019/10/12

概览Spring

设计关键策略

  • 基于POJO和最小侵入性编程
  • 通过依赖和面向接口实现松耦合
  • 基于切面和惯例进行声明式编程
  • 通过切面和模板减少样板代码

Spring通过依赖注入,应用切面以及各种模板来简化JAVA开发

起步

  • 引入依赖
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

模块概览

Spring分为若干个模块,如下图所示

Spring模块

  • Test:为测试提供支持
  • Core Container:提供了Spring最核心的IOC功能,AOP、Aspects等都是基于此实现的
  • Web:提供了web开发的相关能力
  • Data Access:提供数据访问的功能

核心

Spring的核心是DI(依赖注入)与AOP(面向切面编程)

  • DI(Dependency Injection)是一种实现IOC(nversion of Control)的方式,通过控制反转,可以有效降低代码之间的耦合,把对象的控制交给外部容器

容器与配置

既然Spring是管理对象的一个容器,我们首先就需要创建一个容器出来,在开发当中,这个容器被称为上下文(Context),这些上下文都实现了一个叫做ApplicationContext的接口,其中常用的实现类如下:

  • AnnotationConfigApplicationContext
  • AnnotationConfigWebApplicationContext
  • ClassPathXmlApplicationContext
  • FileSystemXmlApplicationContext
  • XmlWebApplicationContext

同时,这个ApplicationContext接口最终的根接口是BeanFactory,这个接口提供了容器的基本功能,可以看做是容器的基本规范,但时功能肯定没有ApplicationContext多,下表是两者的比较。

特性 BeanFactory ApplicationContext
Bean instantiation/wiring Yes Yes
Integrated lifecycle management No Yes
Automatic BeanPostProcessor registration No Yes
Automatic BeanFactoryPostProcessor registration No Yes
Convenient MessageSource access (for internalization) No Yes
Built-in ApplicationEvent publication mechanism No Yes

由此可见,ApplicationContext是青出于蓝而胜于蓝,同时还有最重要的一点,ApplicationContext中的Bean是延迟加载,而BeanFactory则是立即加载。

既然要创建容器,那必然少不了相关配置信息,只有向Spring提供这些信息,Spring才能为你管理对象。 配置的方式有三种:

  • XML配置
  • JAVA注解配置
  • JAVA代码配置

在Spring的早期版本,Spring只能通过XML配置,这造成了Spring配置起来及其繁琐,间接地成了XML的代名词。但之后,Spring引入了注解配置,使配置过程简化,但有些方面,使用XML配置比注解配置更高效,比如事务方面的配置,在本系列文章中,我们将不再使用XML配置的方式,而是使用注解配置与代码配置。

第一个Spring程序

// Main.java
// 创建一个使用注解配置的容器,配置源选择Config这个类
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);

//从容器当中获取一个类型为Pojo的对象
context.getBean(Pojo.class).run();

至于配置的详情,我们将留到下一篇文章深入探讨,这里不详细说明

// Config.java
@Configuration
public class Config {
    @Bean
    public Pojo pojo(){
        return new Pojo();
    }
}

class Pojo {
    public void run(){
        System.out.println("go");
    }
}

Post Directory