前文已经介绍Spring IOC&DI主要解决了对象和对象之间的耦合问题,将每一个对象作为bean交给Spring容器来管理。本文主要总结Spring IOC&DI的具体应用,包括其xml配置文件写法、依赖注入方式、bean获取方式等。
既然是解决对象和对象之间的耦合,那根据所依赖对象的类型可以分为:
(1)基本类型对象:所依赖对象为基本类型对象。如:int、String等
(2)自定义类型:所依赖对象为其他的自定义的类类型。
(3)集合类型:所依赖对象为集合类型,如List、Set、Map、Property等
(4)null 空值
同时根据依赖注入的方式分为两种方式:构造器注入和setter注入(接口注入已基本被废弃)
还是以上一节的例子。
1、构造器注入方式
(1) 基本类型对象注入
假设在dao的实现类中有一个属性用来记录具体的数据库的名字,则定义如下:
package com.springframework.ioc; public class MysqlDaoImpl implements MyDao{ private String name; public MysqlDaoImpl(String name){ this.name = name; } @Override public void addUser(){ System.out.println("this is " + name + " add user..."); } }
需要将name通过构造函数形式注入进来。
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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd" default-lazy-init="true"> <!-- beans declare go here --> <bean id="mysql" class="com.springframework.ioc.MysqlDaoImpl"> <constructor-arg value="mysql"/> </bean> <!-- 通过含参构造器注入 --> <bean id = "myservice" class="com.springframework.ioc.MyService"> <constructor-arg ref = "mysql"/> </bean> </beans>
如果构造函数中有两个参数呢,假设现在又加了一个id的参数。
package com.springframework.ioc; public class MysqlDaoImpl implements MyDao{ private String name; private int id; public MysqlDaoImpl(String name, int id){ this.name = name; this.id = id; } @Override public void addUser(){ System.out.println("this is " + name "id is " + id + " add user..."); } }
这个时候可以继续以上面的方式配置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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd" default-lazy-init="true"> <!-- beans declare go here --> <bean id="mysql" class="com.springframework.ioc.MysqlDaoImpl"> <constructor-arg value="mysql"/> <constructor-arg value="1"/> </bean> <!-- 通过含参构造器注入 --> <bean id = "myservice" class="com.springframework.ioc.MyService"> <constructor-arg ref = "mysql"/> </bean> </beans>
会输出正确的结果,
this is mysql id is 1 add user...
但是如果我调换一下顺序,变成这样:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd" default-lazy-init="true"> <!-- beans declare go here --> <bean id="mysql" class="com.springframework.ioc.MysqlDaoImpl"> <constructor-arg value="1"/> <constructor-arg value="mysql"/> </bean> <!-- 通过含参构造器注入 --> <bean id = "myservice" class="com.springframework.ioc.MyService"> <constructor-arg ref = "mysql"/> </bean> </beans>
此时因为类型不匹配会报错,但是如果我两个参数都是String类型的,就会傻傻分不清楚了,所以,为了能够分清楚,一般会如下设置,指定参数的index:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd" default-lazy-init="true"> <!-- beans declare go here --> <bean id="mysql" class="com.springframework.ioc.MysqlDaoImpl"> <constructor-arg index="1" value="1"/> <constructor-arg index="0" value="mysql"/> </bean> <!-- 通过含参构造器注入 --> <bean id = "myservice" class="com.springframework.ioc.MyService"> <constructor-arg ref = "mysql"/> </bean> </beans>
这样就可以清楚的知道注入的是哪一个参数。
(2) 自定义类型
自定义类型即所依赖的对象为自定义的类,比如在上一条中介绍的MyService类依赖MysqlDaoImpl类,在xml配置文件中配置如下:
</bean> <!-- 通过含参构造器注入 --> <bean id = "myservice" class="com.springframework.ioc.MyService"> <constructor-arg ref = "mysql"/> </bean>
如果有两个参数都是自定义类型,则可以按照以上针对基本类型的做法,设置构造器的index属性。如下:
<bean id = "myservice" class="com.springframework.ioc.MyService"> <constructor-arg index="0" ref = "mysql"/> <constructor-arg index="1" ref = "description"/> </bean>
其中description是另外一个引用的bean的id。
(3)集合类型
总体概括有四种集合类型:List、Set、Map、Props。
集合中可以存放基本类型,也可以存放自定义类型。
存放基本类型的xml配置如下,分别有List、Set和Map类型,其中List、Set类型容器中存放的是String类型数据,Map类型容器中键值为String类型,值为Integer类型数据:
<bean id = "myservice" class="com.springframework.ioc.MyService"> <constructor-arg index="0" ref = "mysql"/> <constructor-arg index="1" ref = "description"/> <constructor-arg index="2"> <list> <value>xiaoming</value> <value>xiaohong</value> <value>xiaolin</value> </list> </constructor-arg> <constructor-arg index="3"> <set> <value>jin</value> <value>yin</value> <value>yin</value> </set> </constructor-arg> <constructor-arg index="4"> <map> <entry key="wang" value="1"/> <entry key="li" value="2"/> <entry key="hu" value="3"/> </map> </constructor-arg> </bean>
Props与Map类型的容器差不多,只是Props只能存放String类型的键和值。
如果容器中存放的是自定义类型,xml文件中的配置如下:
<bean id = "myservice" class="com.springframework.ioc.MyService"> <constructor-arg index="0" ref = "mysql"/> <constructor-arg index="1" ref = "description"/> <constructor-arg index="2"> <list> <ref bean="bean1"> <ref bean="bean2"> <ref bean="bean3"> </list> </constructor-arg> <constructor-arg index="3"> <set> <ref bean="bean1"> <ref bean="bean2"> <ref bean="bean3"> </set> </constructor-arg> <constructor-arg index="4"> <map> <entry key="wang" value-ref="bean7"/> <entry key-ref="bean10" value-ref="bean8"/> <entry key="hu" value-ref="bean9"/> </map> </constructor-arg> </bean>
(4)null空值
如果想要给某一个类型赋空值,xml配置文件配置如下:
<constructor-arg index="0"> <null/> </constructor-arg>
相关推荐
JAVAEE之Spring IoC&DI Spring IoC(Inversion of Control,即控制反转)是Spring框架的核心机制之一,它提供了一种解耦合的方式,使得应用程序的各个组件之间能够松散耦合,提高了系统的灵活性和可维护性。 在传统...
1. **构造器注入**:通过构造函数传递依赖对象,Spring容器会根据构造函数的参数类型创建并注入相应的对象。这种方式确保对象在创建时就具备所有依赖,增强了对象的完整性和一致性。 2. **setter注入**:通过setter...
Spring Ioc(Inversion of Control,控制反转)是Spring框架的核心特性之一,它改变了传统应用程序中对象的创建和管理方式。在传统的软件设计中,对象的创建和依赖关系的维护通常由代码自身来完成,而在Spring Ioc中...
Spring的核心特性之一就是它的Inversion of Control(IoC,控制反转)容器,也被称为Dependency Injection(DI,依赖注入)。这个概念是Spring框架使应用程序组件之间解耦的关键。让我们深入探讨一下Spring的IoC和...
在软件开发领域,IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)是两种重要的设计模式,特别是在Java和Spring框架中被广泛使用。这些概念有助于提高代码的可测试性、可维护性和模块...
在实际应用中,DI通常作为IoC容器的一部分来实现,例如Spring框架中的BeanFactory或ApplicationContext,它们都提供了依赖注入的功能,从而帮助开发人员遵循IoC的原则,构建出更加灵活、可维护的软件系统。...
2. **依赖注入(DI)**:Spring IOC的主要功能之一就是依赖注入。有两种方式实现DI:构造器注入和setter注入。构造器注入是在Bean实例化时通过构造函数传递依赖,而setter注入则是通过调用setter方法设置依赖。在`...
3. 注入依赖:当Bean需要使用到其他的Bean时,容器负责注入这些依赖,可以通过构造函数注入或者通过setter方法注入。 Spring IOC操作的详细步骤讲解截图可能会包含以下内容: 1. 创建Spring项目,并配置项目依赖...
依赖可以通过属性注入、构造函数注入或方法注入等方式实现。 4. **Bean的作用域**:Spring提供了多种Bean的作用域,如单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)等,根据不同的需求...
- **依赖注入(DI,Dependency Injection)**:是IOC的一种实现方式,Spring通过DI管理对象的依赖关系,即在运行时将依赖的对象注入到需要它们的组件中。 **2. Spring容器** - **Bean工厂(BeanFactory)**:...
今天有空,写了基于C#使用Spring.Net的演示实例,希望能给有需要的人带来帮助,其中演示了配置下的IOC、AOP、属性注入、构造函数注入、通知过滤器、以及不使用配置直接代码硬编的AOP动态代码过程,另外还增加了...
构造器注入是在创建对象时,通过构造函数传递依赖对象。这种方式确保了对象在被创建时就具备了所有必要的依赖,增强了对象的完整性和一致性。Spring支持多种类型的构造器注入,包括单一参数的构造器和多个参数的构造...
Spring 提供了构造函数注入、setter 注入和接口注入三种方式来实现依赖注入。通过这种方式,对象的依赖关系被明确地定义在配置中,而不是硬编码在对象内部,提高了代码的可测试性和可维护性。 **面向切面编程(AOP...
Spring框架是Java开发中不可或缺的一部分,它以IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)为核心,极大地简化了应用程序的复杂性。在本教程中,我们将深入探讨如何通过XML配置在...
Spring IOC,即Inversion of Control(控制反转),是Spring框架的核心特性之一,它负责管理和装配应用程序中的对象。在传统的编程模式中,对象通常自行创建和管理它们所依赖的其他对象,这导致了代码间的高耦合。而...
在Spring中,实现IOC的主要方式有两种:依赖注入(Dependency Injection,DI)和基于XML的配置。在这个项目中,可能结合了这两种方法。依赖注入可以通过构造函数注入、setter方法注入或接口注入来实现,使得对象间的...
手写版本可能会实现构造器注入,通过分析bean的构造函数及其参数,自动寻找依赖并注入。 4. **解决循环依赖**:循环依赖是IOC容器需要处理的复杂问题。在手写版本中,可能采用预初始化、提前暴露、延迟初始化等方式...
Spring容器通过setter方法、构造函数或自动装配(byName, byType, autowire)来注入Bean的依赖。这样,我们不需要在代码中手动创建和管理对象,而是由Spring容器自动完成。 4. **Bean的作用域**:Spring提供了多种...
JavaEE Spring 框架是企业级应用开发的首选之一,尤其在控制反转(Inversion of Control, 简称IoC)和依赖注入(Dependency Injection, DI)方面表现出色。IoC是一种设计模式,它将对象的创建和管理从应用程序的业务...
标题中的"Spring的IOC和DI的区别"涉及到Spring框架的核心特性,即控制反转(Inversion of Control,简称IOC)和依赖注入(Dependency Injection,简称DI)。这两个概念是理解Spring框架工作方式的关键。 首先,控制...