前言:一直想写一个关于Spring的系列文章,但是构思许久却不知道以什么方式阐述,毕竟要把一个复杂框架说清楚并不是那么容易的,我也只能尽力而为了。Spring系列文章打算以这样的顺序展开:以思维导图的方式统筹介绍Spring -> 介绍Spring基本用法 -> 深入使用Spring -> 窥探Spring源码 -> 如有必要以思维导图总结概述Spring。本文介绍Spring基本用法,目的更多的是入门Spring的使用方法,demo、附件项目更是快速查询Spring基本用法的工具。

本篇文章重点关注以下问题:

  • 概述Spring核心功能
  • IOC、DI基本概念
  • 两种依赖注入的方式

1. Spring核心功能

Spring是一个非常活跃的开源框架,它以一种非侵入式的方式来管理你的代码,Spring提倡”最少侵入”,甚至在项目开发过程中,你完全没感到Spring在发挥作用。

Spring框架的核心功能有两个:

  • 一是Spring容器作为超级工厂,负责创建、管理所有的java对象,这些java对象称为Bean。(IOC实现)
  • 二是Spring容器管理Bean之间的依赖关系。(DI实现)

2. IOC、DI基本概念

        IOC:即控制反转,把对象的创建、初始化、销毁等工作交给spring容器来做,由spring容器控制对象的生命周期。

* 控制:就是指对对象的创建、维护、销毁等生命周期的控制,这个过程一般是由我    们的程序去主动控制的,如使用new关键字去创建一个对象(创建),在使  用过程中保持引用(维护),在失去全部引用后由GC去回收对象(销  毁)。
* 反转:就是指对对象的创建、维护、销毁等生命周期的控制由程序控制改为由IOC  容器控制,需要某个对象时就直接通过名字去IOC容器中获取。  

DI:即依赖注入,是IOC的一种重要实现,与IOC描述的是同一个概念。

一个对象的创建往往会涉及到其他对象的创建,比如一个对象A的成员变量持有着另一个对象B的引用,这就是依赖,A依赖于B。IOC机制既然负责了对象的创建,那么这个依赖关系也就必须由IOC容器负责起来。负责的方式就是DI——依赖注入,通过将依赖关系写入配置文件,然后在创建有依赖关系的对象时,由IOC容器注入依赖的对象,如在创建A时,检查到有依赖关系,IOC容器就把A依赖的对象B创建后注入到A中(组装,通过反射机制实现),然后把A返回给对象请求者,完成工作。

其工作过程如下图所示:


        对应于Spring的两个核心功能,程序员所要做的工作就两点:

  • 一是开发Bean:Spring建议面向接口编程,java对象间的耦合仅在接口层面,无需关心服务的具体实现;
  • 二是配置Bean:通过xml配置文件或注解的方式告知Spring,需要Spring管理哪些Bean,以及Bean之间的依赖关系;

在需要使用Bean时,直接从容器中去拿即可。

3. 依赖注入的方式

依赖注入(DI)通常有如下两种方式:

  • 设值注入:IOC容器使用成员变量的setter方法来注入被依赖对象;
  • 构造注入:IOC容器使用构造器来注入被依赖对象。

3.1 设值注入

设值注入:IOC容器使用成员变量的setter方法来注入被依赖对象。

开发过程如下:(此处以xml配置文件的形式说明)

步骤一:开发Bean
       定义服务类接口:

* Pen.java:用于实现签名功能;

* Person.java:需要使用Pen来签名,即Person.java依赖于Pen.java

实现服务类功能:

* BallpointPen.java:提供用圆珠笔实现签名的功能;

* Pencil.java:提供用铅笔实现签名的功能;

* Chinese.java:Person的子类,表示中国人来签名;

Chinese.java代码如下,类中需要定义Pen接口对象的成员变量pen,并提供其setter方法,用于设值注入:

package com.wj.chapter1.ioc.setter.xml.Service;  import com.wj.chapter1.ioc.setter.xml.IService.Pen;
import com.wj.chapter1.ioc.setter.xml.IService.Person;  public class Chinese implements Person {  private Pen pen;    /** 代码耦合的层次仅限于接口层次. */  // 设值需要的setter方法  public void setPen(Pen pen) {  this.pen = pen;  }  @Override  public void signOwnName() {  pen.signName("中国人");  }  }  

步骤二:配置Bean

通过xml配置文件的方式告知Spring,需要Spring管理哪些Bean,以及Bean之间的依赖关系。

<?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  http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">  <!-- 设值注入(XML方式):通过成员变量的setter方法注入被依赖对象. -->  <!-- 属性id    : Bean在Spring容器中的唯一标识.      -->  <!-- 属性class : 指定该Bean的具体实现类,而不能是接口.  -->  <bean id="chinese"      class="com.wj.chapter1.ioc.setter.xml.Service.Chinese">  <!-- 驱动调用chinese的setPen()方法,将容器中pencil(或ballpointPen)作为传入参数 -->  <!-- property子节点指明依赖关系 -->  <property name="pen" ref="pencil"></property>  </bean>  <!-- 定义Pen.class的两个实现类Bean. -->  <bean id="pencil"       class="com.wj.chapter1.ioc.setter.xml.Service.Pencil"></bean>  <bean id="ballpointPen" class="com.wj.chapter1.ioc.setter.xml.Service.BallpointPen"></bean>
</beans> 

xml配置文件中,每个Bean对应Spring容器里的一个java实例,property节点元素指明Bean之间的依赖关系。

步骤三:调用Bean

使用前面定义的服务,实现中国人用铅笔签名的功能:

package com.wj.chapter1.ioc.setter.xml.main;  import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;  import com.wj.chapter1.ioc.setter.xml.IService.Person;  public class Main {  // 1.指明xml配置文件位置,便于Spring读取,从而知道Bean的相关信息  private static final String PATH_XML = "com/wj/chapter1/ioc/setter/xml/applicationContext-setter.xml";  @SuppressWarnings("resource")  public static void main(String[] args) {  // 2.根据xml配置文件,创建Spring IOC容器的上下文  ApplicationContext cxt     = new ClassPathXmlApplicationContext(PATH_XML);  // 3.在需要使用服务的时候,直接从Spring容器中获取  Person             chinese = cxt.getBean("chinese", Person.class);  // 4.获取提供服务的对象后,调用Bean的服务  chinese.signOwnName();  }
}  

步骤四:查看调用结果

3.2 构造注入

构造注入:IOC容器使用构造器来注入被依赖对象。

开发过程如下:(此处以xml配置文件的形式说明)

步骤一:开发Bean

定义服务类接口:

* Pen.java:用于实现签名功能;

* Person.java:需要使用Pen来签名,即Person.java依赖于Pen.java

实现服务类功能:

* BallpointPen.java:提供用圆珠笔实现签名的功能;

* Pencil.java:提供用铅笔实现签名的功能;

* Chinese.java:Person的子类,表示中国人来签名;

Chinese.java代码如下,类中需要定义Pen接口对象的成员变量pen,并提供带参数的构造函数,用于构造注入:

package com.wj.chapter1.ioc.constructor.xml.Service;  import com.wj.chapter1.ioc.constructor.xml.Iservice.Pen;
import com.wj.chapter1.ioc.constructor.xml.Iservice.Person;  public class Chinese implements Person {  private Pen pen;    /** 代码耦合的层次仅限于接口层次. */  // 构造注入所需的带参数的构造器  public Chinese(Pen pen) {  this.pen = pen;  }  @Override  public void signOwnName() {  pen.signName("中国人");  }
} 

步骤二:配置Bean

通过xml配置文件的方式告知Spring,需要Spring管理哪些Bean,以及Bean之间的依赖关系。

<?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  http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">  <!-- 构造注入(XML方式):通过调用构造函数注入被依赖对象. -->  <!-- 属性id    : Bean在Spring容器中的唯一标识.      -->  <!-- 属性class : 指定该Bean的具体实现类,而不能是接口.  -->  <bean id="chinese"      class="com.wj.chapter1.ioc.constructor.xml.Service.Chinese">  <!-- 下面只有一个constructor-arg子元素,驱动Spring调用Chinese带一个参数的构造器来创建对象 -->  <constructor-arg name="pen" ref="ballpointPen" index="0"></constructor-arg>  </bean>  <bean id="pencil"       class="com.wj.chapter1.ioc.constructor.xml.Service.Pencil"></bean>  <bean id="ballpointPen" class="com.wj.chapter1.ioc.constructor.xml.Service.BallpointPen"></bean>  </beans>

步骤三:调用Bean

使用前面定义的服务,实现中国人用圆珠笔签名的功能:

package com.wj.chapter1.ioc.constructor.xml.main;  import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;  import com.wj.chapter1.ioc.constructor.xml.Iservice.Person;  public class Main {  // 1.指明xml配置文件位置,便于Spring读取,从而知道Bean的相关信息  private static final String PATH_XML = "com/wj/chapter1/ioc/constructor/xml/applicationContext-constructor.xml";  @SuppressWarnings("resource")  public static void main(String[] args) {  // 2.根据xml配置文件,创建Spring IOC容器的上下文  ApplicationContext cxt     = new ClassPathXmlApplicationContext(PATH_XML);  // 3.在需要使用服务的时候,直接从Spring容器中获取  Person             chinese = cxt.getBean("chinese", Person.class);  // 4.获取提供服务的对象后,调用Bean的服务  chinese.signOwnName();  }
}  

步骤四:查看调用结果

3.3 两种注入方式的对比

建议采用以设值注入为主,构造注入为辅的注入策略。对于依赖关系无需变化的注入,可以考虑采用构造注入,其他依赖关系的注入,则尽量用设值注入。

Spring基本用法1——Spring的核心机制:IOC、DI相关推荐

  1. Spring核心机制IoC与AoP梳理

    Spring核心机制IoC与AoP梳理 文章目录 Spring核心机制IoC与AoP梳理 IoC介绍 IoC案例介绍 pom文件中IoC环境引入 自己new对象方法举例(正转) IoC创建对象 基于X ...

  2. 认识Spring核心容器IoC/DI

    对于 Java 编程来说,使用 Spring 能完成的更加快速,更容易并更安全.Spring 专注于速度,便捷与开发效率,也正是如此,让Spring成为了全世界最流行的 Java 框架.从配置到安全, ...

  3. Spring Boot spring.factories 用法及原理

    文章目录 1. spring.factories 用法 2. spring.factories 实现原理 3. spring.factories 用于解决什么问题? 3.1 业务场景思考及 start ...

  4. Spring的核心机制依赖注入,Junit测试与Java基础Getter和Setter两种方法意义——2017.07.26...

    今天对Spring的基础理解又加深了一丢丢. 1 首先Spring的基础配置文件中,主要由以下几个配置文件, 1 <beans xmlns:xsi="http://w3.org/200 ...

  5. Spring的核心机制依赖注入简介

    Spring能有效地组织J2EE应用各层的对象.不管是控制层的Action对象,还是业务层的Service对象,还是持久层的DAO对象,都可在Spring的管理下有机地协调.运行.Spring将各层的 ...

  6. 第 1-6 课:Spring 的另一个核心机制 AOP

    前言 前面的内容集中对 Spring IoC 进行了详细讲解,之前说过,Spring 的两大核心机制是 IoC 和 AOP,本讲我们就一起来学习 AOP 的相关知识. AOP(Aspect Orien ...

  7. [Spring 深度解析]第3章 核心容器

    第3章 ◄核心容器► ​ 在上一章节中,我们大致了解了Spring框架,并学习了控制反转(IOC)和面向切面编程(AOP)两个重要的编程思想,这一章我们将开始学习Spring框架中的核心容器. 本章主 ...

  8. 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  9. spring核心之IOC

    spring IOC   控制反转    核心思想 了解IOC,首先需要了解DI  --- 软件设计的重要思想            依赖注入 什么事依赖注入呢? 例子:设计行李箱类 传统写法:首先设 ...

最新文章

  1. Oracle 如何设置shared pool 和sga大细, 应该设置几大
  2. 实时计算Flink——产品安全
  3. matlab和python哪个运行快_MATLAB比Python更快吗?
  4. 框架:spring、springmvc、springboot
  5. My story with XJTLU Library
  6. Visual Studio提示“无法启动IIS Express Web服务器”的解决方法
  7. caffe生成voc格式lmdb
  8. JSP指示元素%@ % 与指示类型
  9. java.util.vector中的vector的详细用法
  10. 爬虫python区别_Python爬虫-04:贴吧爬虫以及GET和POST的区别
  11. chrome插件:实现任意窗口,显示特定icon
  12. inceptor游标使用及优化
  13. 数据库大作业-学生宿舍管理系统
  14. Echarts官网无法打开的问题
  15. Gliffy Diagrams(在线绘图)
  16. 倍福--和威伦触摸屏通信
  17. 在登陆Fedora 9时选择语言
  18. java gc_Java GC的那些事(1)
  19. oracle 脚本检查点,oracle nca脚本检查点
  20. git clone 身份验证失败

热门文章

  1. Vacuum探索——初识vacuum
  2. vacuum freeze
  3. 2023北京大学计算机考研信息汇总
  4. 5月12~15在青岛
  5. 仲裁结果出炉,FF将绕过恒大健康获得5亿美元外部融资
  6. c语言二级安卓软件,C语言二级考试题库
  7. 如何利用无常损失从流动资金池中提取价值
  8. 数据库(十)-单表查询(1)条件查询
  9. 第16课 闪电网络(Lightning Network) 之 HTLC
  10. Windows10 蓝屏 DRIVER_IRQL_NOT_LESS_OR_EQUAL (vfilter.sys)的可能解决方法