設計關鍵策略
- 基於POJO和最小侵入性編程
- 通過依賴和麪向接口實現鬆耦合
- 基於切面和慣例進行聲明式編程
- 通過切面和模板減少樣板代碼
Spring通過依賴注入,應用切面以及各種模板來簡化JAVA開發
起步
- 引入依賴
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
模塊概覽
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");
}
}