前言:一直想写一个关于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基础:IoC容器(1)”这个主题中,我们将深入探讨Spring的核心组件——IoC容器,以及它如何管理对象的生命周期和依赖关系。 IoC(Inversion of Control),也称为控制反转,是一种设计模式,它将对象的创建...
spring-core:核心模块 依赖注入IOC和DI的最基本实现 spring-beans:Bean工厂与装配 spring-context:上下文,即IOC容器 spring-context-support:对IOC的扩展,以及IOC子容器 spring-context-indexer:类管理组件和...
【Spring核心IOC以及DI】是Spring框架中的关键概念,它们是Spring实现控制反转(Inversion of Control,简称IOC)和依赖注入(Dependency Injection,简称DI)的基石。这两个概念是Spring框架的核心,使得应用程序的...
【Spring——DI和通过注解实现IOC和DI】 在软件设计中,依赖注入(Dependency Injection,简称DI)是一种设计模式,用于减少代码间的耦合,提高应用的可测试性和可维护性。DI的核心思想是,组件之间的依赖关系不再...
Spring Ioc(Inversion of Control,控制反转)是Spring框架的核心特性之一,它改变了传统应用程序中对象的创建和管理方式。在传统的软件设计中,对象的创建和依赖关系的维护通常由代码自身来完成,而在Spring Ioc中...
什么是spring,spring核心,spring优点,spring体系结构, 入门案例,DI基础,核心API,文档内附代码
在Spring框架中,IOC(Inversion of Control,控制反转)是其核心概念之一,它改变了传统应用程序中的对象创建和管理方式。本学习资料主要聚焦于Spring的IOC容器,特别是从最基本的BeanFactory开始,逐步深入理解...
这个压缩包包含的是Spring框架的IOC(Inversion of Control)核心组件的jar包,是理解和使用Spring进行应用程序开发的基础。 **IOC容器** IOC,或称DI,是Spring的核心特性,它使得开发者可以将对象的创建和管理...
Spring的核心特性包括AOP(面向切面编程)和IOC(控制反转),以及依赖注入(DI)。以下是对这些概念的详细解释: **面向切面编程(AOP)** AOP是一种编程范式,它允许开发者将关注点从主业务逻辑中分离出来,例如...
Spring框架是Java开发中不可或缺的一部分,它通过提供控制反转(IOC)和面向切面编程(AOP)等核心特性,极大地简化了企业级应用的构建。让我们深入探讨这两个概念及其在Spring中的实现机制。 首先,Spring的控制...
Spring 框架是Java开发中的核心框架,它主要由两个关键部分组成:IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。这两个概念是Spring框架的核心特性,极大地简化了企业...
《Spring IOC:找对象的一次革命》一文深入探讨了Spring框架中的一种核心特性——Inversion of Control(IoC),即控制反转。IoC是一种设计模式,它将对象的创建和管理责任从对象本身转移到了一个外部实体,通常称为...
对于Spring的使用者而言,IOC容器不仅是管理Bean(即应用中的对象实例)生命周期的中心,同时也是实现依赖注入(Dependency Injection,DI)的关键所在。在Spring框架中,IOC容器扮演着至关重要的角色,它负责管理...
Spring框架是Java开发中不可或缺的一部分,它通过提供两种核心特性——控制反转(IoC)和面向切面编程(AOP)来简化应用的构建。理解并掌握这两种技术对于任何Java开发者来说都至关重要。 **控制反转(IoC)**,也...
在Java开发领域,Spring框架是应用最广泛的轻量级框架之一,它以其强大的依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IoC)特性深受开发者喜爱。本文将深入探讨Spring的DI和IoC...
首先,让我们理解Spring的核心——IoC容器。IoC是一种设计模式,它改变了对象获取依赖的方式。在传统的编程中,对象会主动去寻找并创建它所需要的依赖。而在IoC中,这个过程被反转,由外部的容器负责创建对象及其...
在本教程中,我们将深入探讨Spring框架中的一个重要概念——依赖注入(Dependency Injection,简称DI),以及如何通过XML配置实现这一机制。Spring是一个流行的Java企业级应用程序框架,它提供了丰富的功能,包括...
1. `spring-beans.jar`: 这个包包含了Spring框架的基本组件,如Bean工厂,它是IoC容器的基础,负责读取配置元数据(XML或Java注解),并根据这些信息创建和管理Bean。 2. `spring-context.jar`: 这个包扩展了`...
Spring框架是Java开发中不可或缺的一部分,它主要由两个核心组件构成:IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。本笔记将深入探讨这两个概念以及它们在Spring中...
本案例主要探讨的是Spring框架的核心特性之一——依赖注入(Dependency Injection,简称DI),通常也被称为IOC(Inversion of Control,控制反转)。通过这个小案例,我们可以深入理解Spring如何实现IoC以及属性注入...