spring 这个词在不同情况下有不同意义。可以指 Spring 框架本身,但更多地被用来表示 Spring 整个家族的产品。
学习框架必须要知道它的设计理念,Spring 框架有着以下的理念:
Spring 让你在架构种的各个层面有更多的选择,并且允许你尽晚的做出决策。比如,你在项目完成后可以通过更改配置来切换持久层的提供者。Spring 具有强大的灵活性,它不在意你是如何完成工作的,它尽可能多地支持不同的应用需求。Spring 具有强大的向后兼容性。Spring 的更新都是精心设计的,而且它对 JDK 的版本要求也是经过精心挑选的,这让你很容易就能更新你的产品。Spring 团队对 API 的设计十分谨慎,这使得这些 API 在很多版本种都是完全通用的,而且可以使用好几年。Spring 本身的代码非常简洁,而且具有非常易于阅读的 javadoc,它是极少数只写有意义的代码的项目,而且它的包之间,没有循环依赖。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
相关资源:JAVA上百实例源码以及开源项目