实例化 Spring IoC 容器
Spring 核心容器的理论很简单:Spring 核心容器就是一个超级大工厂,所有的单例对象都由它创建并管理 。
必须创建、实例化 Spring IoC 容器,读取其配置文件来创建 Bean 实例。然后可以从 Spring IoC 容器中得到可用的 Bean 实例。
BeanFactory 「初始」接口
└── ApplicationContext 最常用接口
└── AbstractApplicationContext 接口的抽象实现类
├── ClassPathXmlApplicationContext 具体实现类之一
└── AnnotationConfigApplicationContext 具体实现类之二
Spring IoC 容器主要是基于 BeanFactory 和 ApplicationContext 两个接口:
老祖宗:BeanFactory 接口
“BeanFactory” 是 Spring IoC 容器的顶层接口,它是整个 Spring IoC 容器体系的「老祖宗」。
「老祖宗」接口中定义了我们未来最常用、最关注的方法:“getBean” 方法。
最常用接口:ApplicationContext
ApplicationContext 是未来我们最常用接口。
基于多态之一"接口的引用指向实现类的对象",我们通常会习惯性将引用的类型定义成 ApplicationContext ,然后让它指向它的实现类的对象。
形如:
ApplicationContext context = new 某实现类();
曾经最常用实现类 ClassPathXmlApplicationContext
ClassPathXmlApplicationContext 是 ApplicationContext 的实现类之一。
在 “注解” 和 “基于注解的 Java 代码配置” 流行起来之前,使用 .xml 文件进行配置是最常用,甚至是唯一的配置方式。
ClassPathXmlApplicationContext 它从 classpath 中加载一个或多个 “.xml” 配置文件,构建一个应用程序上下文。
new ClassPathXmlApplicationContext("aaa.xml");
new ClassPathXmlApplicationContext("bbb.xml", "ccc.xml");
现在最常用实现类 AnnotationConfigApplicationContext
AnnotationConfigApplicationContext 是 ApplicationContext 的实现类之一。
AnnotationConfigApplicationContext 和 ClassPathXmlApplicationContext 功能类似,但它需要的是一个配置类或多个配置类,而非配置文件。
new AnnotationConfigApplicationContext(Xxx.class);
new AnnotationConfigApplicationContext(Yyy.class, Zzz.class);
使用 getBean 方法获得 Bean
在获得"应用程序上下文"(ApplicationCotnext,也就是 IoC 容器)后,你只需要调用 “getBean” 方法并传入唯一的 Bean ID 和 Bean 的 Class 对象,就可以获得容器中的 Bean 。
// 大多数情况下 id 非必须
Human tom = context.getBean("tom", Human.class);
// 或
Human tom = context.getBean(Human.class);
配置思维的变化
使用 Java 代码进行 Java Bean 的配置远比使用 XML 配置文件进行要简单很多,因为进行配置的『思维模式』发生了变化:
-
使用 XML 进行配置,你要面面俱到地『告知』Spring 你要如何如何地去创建、初始化一个 Bean 。
-
使用 Java 代码进行配置,你只需要提供一个方法,你自己全权(程序员)负责方法的具体实现,并在方法的最后返回一个 Java Bean, Spring 不关心你的方法的实现内容和细节,它只保证未来调用你所写的方法,且只调用一次 。
在这种思路下,XML 配置的 “很多情况” 在 Java 代码中就被统一成了 “一种情况” ,因此变得更简洁。