Spring 总览及 IOC 容器的使用 —— Spring 官方文档解读(一)
什么是 Spring?
spring 这个词在不同情况下有不同意义。可以指 Spring 框架本身,但更多地被用来表示 Spring 整个家族的产品。
设计理念
学习框架必须要知道它的设计理念,Spring 框架有着以下的理念:
- Spring 让你在架构种的各个层面有更多的选择,并且允许你尽晚的做出决策。比如,你在项目完成后可以通过更改配置来切换持久层的提供者。
- Spring 具有强大的灵活性,它不在意你是如何完成工作的,它尽可能多地支持不同的应用需求。
- Spring 具有强大的向后兼容性。Spring 的更新都是精心设计的,而且它对 JDK 的版本要求也是经过精心挑选的,这让你很容易就能更新你的产品。
- Spring 团队对 API 的设计十分谨慎,这使得这些 API 在很多版本种都是完全通用的,而且可以使用好几年。
- Spring 本身的代码非常简洁,而且具有非常易于阅读的 javadoc,它是极少数只写有意义的代码的项目,而且它的包之间,没有循环依赖。
控制反转容器(IOC Container)
IOC 介绍
IOC 也被称为依赖注入(dependency injection (DI)),程序员通过设定构造参数、工厂方法的参数等手段来确立各个对象之间的关系,这样,当程序员创建 bean 的时候,相应的依赖会被容器自动的注入到 bean 中,不需要程序员在创建 bean 的时候手动新建那些对象。这使得依赖更容易被管理。(被称为控制反转是因为不再是程序员去将依赖手动注入到相应 bean 中,而是通过容器自动地注入)
org.springframework.beans
和 org.springframework.context
这两个包是 Spring IOC 容器地基础。接口 BeanFactory
提供了一种能够管理任何类型对象的高级配置机制。ApplicationContext
是 BeanFactory
的一个子接口,它多出了这些功能:
- 更容易与 Spring 的 AOP 进行集成
- 消息资源处理(用于国际化)
- 事件发布
- 特定的 Context(例如 web 应用中的
WebApplicationContext
)
总而言之,BeanFactory
提供了基础的功能,而 ApplicationContext
提供了特定的高级功能,是 BeanFacotry
的超集。(通常只有在与其他框架整合的时候才会使用 BeanFactory
)
容器总览
org.springframework.context.ApplicationContext
接口代表了 Spring IOC 容器,它负责通过读取配置元素据来对 bean 进行实例化、组装、配置。元数据的编写方式有三种:XML,Java 注解或者 Java 代码。你可以通过它来构建复杂的对象间依赖关系。
Spring 提供了不少 ApplicationContext
的实现,在独立应用中,最常见的有 ClassPathXmlApplicationContext
和 FileSystemXmlApplicationContext
。XML 是最常用的编写元数据的格式。你也可以通过编写少量的 XML 配置使得它可以支持读取来自注解或者代码的元数据。
在大部分场景下,用户不用显示地实例化一个或多个 IOC 容器。
编写元数据配置并使用
通过上述的内容,我们可以知道 Spring IOC 容器是通过元数据来了解各个对象之间的关系的。最传统的编写元数据的方法为使用 XML 配置文件。(当然这不是唯一的方式,现在更多的人会使用注解或者代码来编写元数据)。当然,你也可以配合 AOP 来配置 IOC 管理之外的对象。(这部分将在后续内容出现。)
现在,我们来看下基于 XML 的元数据的基本编写方式:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="..." class="...">
<!-- id 属性用于指定该 bean 的名字,而 class 属性需要写入一个完整的 classname 来确定为那个类的对象,比如 top.dragondove.demo.bean.Hero -->
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
编写完之后,我们该实例化这个容器并且获取容器中的内容了,下面是一个例子。
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
Hero dove = context.getBean("dove", Hero.class);
System.out.println(dove);
以上是 Spring 容器的简单使用,下一章节将会讲解更多的元数据配置内容及配置方式。本次内容的完整代码在下面列出,至于 Spring 项目的初始化可以直接使用 Spring Boot (采用官网的 spring boot initializr 即可,依赖全都不选即可):
// src/main/java/top/dragondove/demo/bean/Hero.java
package top.dragondove.demo.bean;
// 普通的 javabean
public class Hero {
private String name;
private Integer age;
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Name: " + name + ", Age: " + age;
}
}
<!-- src/main/resources/applicationContext.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置 bean 的元数据 -->
<bean id="dove" class="top.dragondove.demo.bean.Hero">
<property name="name" value="Dove" />
<property name="age" value="18" />
</bean>
</beans>
// src/main/java/top/dragondove/demo/DemoApplication.java
package top.dragondove.demo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import top.dragondove.demo.bean.Hero;
public class DemoApplication {
private static ApplicationContext context;
public static void main(String[] args) {
context = new ClassPathXmlApplicationContext("applicationContext.xml");
Hero dove = context.getBean("dove", Hero.class); // 获取容器中 id 为 dove 的对象并确定其类型为 Hero 类型。
System.out.println(dove);
}
}
运行 DemoApplication 里的 main 方法即可看到效果。
原文地址:https://www.cnblogs.com/dragondove/p/11415798.html