参考自:https://javadoop.com/post/spring-ioc
首先是一个最基本的启动Spring容器的例子:
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationfile.xml");
}
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationfile.xml");
见名知意,也就是从ClassPath中寻找xml配置文件,并根据其xml的内容创建ApplicationContext对象。
Spring除了通过ClassPath寻找xml的方式,还提供了另外两种方式进行创建ApplicationContext。
- FileSystemXmlApplicationContext:其构造函数需要一个xml配置文件的系统中的路径
- AnnotationConfigApplicationContext:基于注解来使用的,它不需要配置文件,采用 java 配置类和各种注解来配置,是比较简单的方式
以下是一个ApplicationContext的继承结构:
可以看到无论是ClassPathXmlApplicationContext还是FileSystemXmlApplicationContext亦或是AnnotationConfigApplicationContext,追本朔源,都继承自ApplicationContext。
而本文主要采用ClassPathXmlApplication为例进行分析。
废话不多说,接下来是一个简单的IOC例子。
首先定义一个接口:
public interface MessageService {
String getMessage();
}
定义该接口实现类:
public class MessageServiceImpl implements MessageService {
public String getMessage() {
return "hello world";
}
}
接下来在resources目录下创建xml配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName">
<bean id="messageService" class="com.xxx.MessageServiceImpl"/>
</beans>
准备工作完成,接下来我们就可以运行了:
public class App {
public static void main(String[] args) {
// 用我们的配置文件来启动一个 ApplicationContext
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application.xml");
// 从 context 中取出我们的 Bean,而不是用 new MessageServiceImpl() 这种方式
MessageService messageService = context.getBean(MessageService.class);
// 输出: hello world
System.out.println(messageService.getMessage());
}
}
以上这个简单的例子说明了ApplicationContext创建过程中,会负责创建Bean实例,往各个Bean中注入依赖等。
BeanFactory简介
BeanFactory,见名知意,也就是创建Bean的工厂,它负责生产和管理各个bean实例。之前的ApplicationContext其实就是一个BeanFactory,若形象一点来描述它们的关系,可以把ApplicationContext看作是汽车,把BeanFactory看作是发动机。
该继承结构的重点在于:
- ApplicationContext继承了ListableBeanFactory,这个Listable的意思就是通过这个接口,我们可以获取多个Bean,通过该结构可以发现,最顶层 BeanFactory 接口的方法都是获取单个 Bean 的。
- ApplicationContext继承了HierarchicalBeanFactory,Hierarchical也就是说我们可以在应用中启用多个BeanFactory,然后可以将各个BeanFactory设置为父子关系。
- AutoWireCapableBeanFactory,autowired这个注解想必用过spring的都很熟悉,它就是用于装配Bean的。但是继承结构中发现,ApplicationContext并没有继承它,但不用担心,虽然没有继承,但是在ApplicationContext接口中定义了一个getAutowireCapableBeanFactory() 方法会对其进行组合。
- ConfigurableListableBeanFactory也是一个特殊的接口,特殊之处在于它继承了第二层所有的三个接口,而 ApplicationContext 没有。这点之后会用到。