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");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章