Spring 总览及 IOC 容器的使用 —— Spring 官方文档解读(一)

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.beansorg.springframework.context 这两个包是 Spring IOC 容器地基础。接口 BeanFactory 提供了一种能够管理任何类型对象的高级配置机制。ApplicationContextBeanFactory 的一个子接口,它多出了这些功能:

  • 更容易与 Spring 的 AOP 进行集成
  • 消息资源处理(用于国际化)
  • 事件发布
  • 特定的 Context(例如 web 应用中的 WebApplicationContext

总而言之,BeanFactory 提供了基础的功能,而 ApplicationContext 提供了特定的高级功能,是 BeanFacotry 的超集。(通常只有在与其他框架整合的时候才会使用 BeanFactory

容器总览

org.springframework.context.ApplicationContext 接口代表了 Spring IOC 容器,它负责通过读取配置元素据来对 bean 进行实例化、组装、配置。元数据的编写方式有三种:XML,Java 注解或者 Java 代码。你可以通过它来构建复杂的对象间依赖关系。

Spring 提供了不少 ApplicationContext 的实现,在独立应用中,最常见的有 ClassPathXmlApplicationContextFileSystemXmlApplicationContext。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

时间: 2024-10-07 05:17:00

Spring 总览及 IOC 容器的使用 —— Spring 官方文档解读(一)的相关文章

比Spring简单的IoC容器

比Spring简单的IoC容器 Spring 虽然比起EJB轻量了许多,但是因为它需要兼容许多不同的类库,导致现在Spring还是相当的庞大的,动不动就上40MB的jar包, 而且想要理解Spring的内部运行机制,阅读它的代码非常重要, 但是往往它的代码非常的"多". 现在根据Spring对Bean的生命周期的处理, 编写出一款非常小的IoC容器, 没有了对XML的解析,而是通过对Config对象的构造而完成IoC配置文件的声明, 相比较XML的方式, 对重构软件非常具有好处, 并且

使用Spring.NET的IoC容器

使用Spring.NET的IoC容器 0. 辅助类库 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SpringDemo.Pub { public static class Pub { public static string ServiceNameA = "SpringDemo.Lib.Oracle.OracleDatabase"; pub

Spring技术内幕——Spring Framework的IOC容器实现(一)

一.SpringIOC容器概述 IOC容器和依赖反转的模式 在面向对象的系统中,对象封装了数据和对数据的处理,对象的依赖关系常常体现在对数据和方法的依赖上.这些依赖关系可以通过把对象的依赖注入交给框架IOC容器来完成.他可以再解耦代码的同时提高了代码的可测试性. 依赖控制反转的实现由很多种方式,在Spring中,IOC容器是实现这个模式的载体,他可以再对象生成或者初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入对方法调用的依赖.这种依赖注入是可以递归的,对象被逐

Spring框架 之IOC容器 和AOP详解

主要分析点: 一.Spring开源框架的简介  二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面向切面编程(AOP)和事务管理配置  一.Spring开源框架的简介  Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来.它是为了解决企业应用开

看完这篇你还敢说,不懂Spring中的IoC容器?

一. 什么是IoC 什么是耦合和内聚 耦合指的就是模块之间的依赖关系.模块间的依赖越多,则表示耦合度越高,相应的维护成本就越高.内聚指的是模块内功能之间的联系.模块内功能的联系越紧密,则表示内聚度越高,模块的职责也就越单一.所以在程序开发中应该尽量的降低耦合,提高内聚.也就是设计原则中的开闭原则和单一职责原则. 工厂模式 工厂模式就是用来解决程序间耦合的一种设计模式.可以把所有要创建的对象放在工厂的一个集合里,当需要使用这个对象的时候,直接从工厂里面取出来用就行. 工厂模式的优点: 一个调用者想

Spring 4 官方文档学习(十一)Web MVC 框架之编码式Servlet容器初始化

在Servlet 3.0+ 环境中,你可以编码式配置Servlet容器,用来代替或者结合 web.xml文件.下面是注册DispatcherServlet : import org.springframework.web.WebApplicationInitializer; public class MyWebApplicationInitializer implements WebApplicationInitializer { @Override public void onStartup(

20191224 Spring官方文档(Core 1.1-1.4)

1. IoC容器 1.1.Spring IoC容器和Bean简介 org.springframework.beans和org.springframework.context包是Spring框架的IoC容器的基础.BeanFactory 接口提供了一种高级配置机制,能够管理任何类型的对象. ApplicationContext是BeanFactory的子接口.它增加了: 与Spring的AOP功能轻松集成 消息资源处理(用于国际化) 活动发布 应用层特定的上下文,例如用于Web应用程序中的WebA

20200106 Spring官方文档【归档】

目录 启动 Overview Core IoC容器 1.1.Spring IoC容器和Bean简介 1.2.容器概述 1.3.Bean总览 1.4.依赖关系 1.5.Bean Scopes 1.6.自定义Bean的性质 1.7.Bean定义继承 1.8.容器扩展点 1.9.基于注释的容器配置 1.10.类路径扫描和托管组件 1.11.使用JSR 330标准注释 1.12.基于Java的容器配置 1.13.Environment 抽象 1.14.注册一个LoadTimeWeaver 2. Reso

Spring Boot 官方文档入门及使用

个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念,请先移步上一篇文章 Spring Boot 学习.本篇原本是为了深入了解下Spring Boot而出现的. 另外,Spring Boot 仍然是基于Spring的,建议在赶完工之后深入学习下Spring,有兴趣可以看看我的 Spring 4 官方文档学习(十一)Web MVC 框架 .欢迎探讨,笑~