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