设计关键策略
-
基于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");
}
}