IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。顾名思义,依赖注入就是Spring管理下的Bean需要依赖Spring容器来帮他注入属性。
这篇博客对IOC和DI有比较好的解释:http://jinnianshilongnian.iteye.com/blog/1471944
Spring IoC容器的依赖有两层含义:Bean依赖容器和容器注入Bean的依赖资源。
● Bean依赖容器:也就是说Bean要依赖于容器,这里的依赖是指容器负责创建Bean并管理Bean的生命周期,正是由于由容器来控制创建Bean并注入依赖,也就是控制权被反转了,这也正是IoC名字的由来,此处的有依赖是指Bean和容器之间的依赖关系。
● 容器注入Bean的依赖资源:容器负责注入Bean的依赖资源,依赖资源可以是Bean、外部文件、常量数据等,在Java中都反映为对象,并且由容器负责组装Bean之间的依赖关系,此处的依赖是指Bean之间的依赖关系,可以认为是传统类与类之间的“关联”、“聚合”、“组合”关系。
从以上我们可以看出,其实依赖注入只是一种装配对象的手段,设计的类结构才是基础,如果设计的类结构不支持依赖注入,Spring IoC容器也注入不了任何东西,从而从根本上说“如何设计好类结构才是关键,依赖注入只是一种装配对象手段”。
Spring注入依赖资源主要有以下两种常用实现方式
● 构造器注入:就是容器实例化Bean时注入那些依赖,通过在在Bean定义中指定构造器参数进行注入依赖,包括实例工厂方法参数注入依赖,但静态工厂方法参数不允许注入依赖(一般不推荐使用)
● setter注入:通过setter方法进行注入依赖(推荐使用)
还有静态工厂方法和实例工厂方法注入(不常用),用法请看博客:
http://jinnianshilongnian.iteye.com/blog/1415277
下面这个Demo用到了Spring属性注入的两种方法(构造器注入和set方法注入)
Spring不仅能注入简单类型数据,还能注入集合(Collection、无序集合Set、有序集合List)类型、数组(Array)类型、字典(Map)类型数据、Properties类型数据:
public class MyBeanA implements MyBean{
private String myName;
private Long myAge;
private Map<String, String> resultMap;
private String arg1;
private Long arg2;
private Boolean b1;
private Boolean b2;
private Boolean b3;
private Properties pros;
private Double[] nums;
//无参构造方法
public MyBeanA() {}
//构造函数 接收配置文件constructor-arg标签的参数
//@java.beans.ConstructorProperties({"arg1", "arg2"})
public MyBeanA(String arg1, Long arg2, Boolean b1, Boolean b2, Boolean b3) {
this.arg1 = arg1;
this.arg2 = arg2;
this.b1= b1;
this.b2= b2;
this.b3= b3;
}
public void domain() {
System.out.println("MyBeanA is executing...");
for (int i = 0; i < nums.length; i++) {
System.out.println(nums[i]);
}
System.out.println(pros.getProperty("1"));
System.out.println(myName);
System.out.println(myAge);
System.out.println(arg1);
System.out.println(arg2);
System.out.println(b1);
System.out.println(b2);
System.out.println(b3);
if (resultMap != null) {
System.out.println(resultMap.values());
}
}
//省略set方法
}
public class MyBeanB implements MyBean{
private MyBeanA beanA;
public void setBeanA(MyBeanA myBeanA) {
this.beanA = myBeanA;
}
public void domain() {
System.out.println("MyBeanB is executing...");
beanA.domain();
}
}
public class MyBeanC {
private Set<MyBean> beanSet;
private List<MyBean> beanList;
private MyBean money;
public void execute() {
System.out.println("MyBeanC is executing...");
System.out.println(money == null);
for (MyBean myBean : beanList) {
myBean.domain();
}
}
//set方法
}
下面是配置文件applicationContext.xml的配置:
Spring的容错处理:注意“value”中指定的全是字符串,由Spring容器将此字符串转换成属性所需要的类型,如果转换出错,将抛出相应的异常。
Spring容器目前能对各种基本类型把配置的String参数转换为需要的类型。Spring类型转换机制对于boolean类型进行了容错处理,除了可以使用“true/false”标准的Java值进行注入,还能使用“yes/no”、“on/off”、“1/0”来代表“true/false”。
<beans ....>
<bean id="bean_a" class="com.chou.spring.bean.MyBeanA">
<!-- constructor-arg即通过构造函数注入,value值表示注入值,ref表示bean的id -->
<!-- <constructor-arg ref="beanId"/> -->
<constructor-arg index="0" value="Hello Spring"/>
<constructor-arg type="java.lang.Long" value="222"/>
<!-- 注入Boolean类型数据 -->
<constructor-arg type="java.lang.Boolean" value="1"/>
<constructor-arg type="java.lang.Boolean" value="on"/>
<constructor-arg type="java.lang.Boolean" value="no"/>
<!-- property代表是通过set方法注入,value表示注入的内容,ref表示bean的id -->
<property name="myName" value="Iverson"/>
<property name="myAge" value="22"/>
<property name="resultMap">
<map key-type="java.lang.Long" value-type="java.lang.String">
<entry key="1" value="用户或密码错"/>
<entry key="2" value="手机号码前缀错误"/>
<entry key="3" value="内容存在关键字错误"/>
<entry key="4" value="超出流量"/>
</map>
</property>
<!-- 注入java.util.Properties类型数据,虽然指定了value-type,但是这里不起作用,键和值默认String -->
<property name="pros">
<props value-type="java.lang.Long">
<prop key="1">First</prop>
<prop key="2">Garent</prop>
<prop key="3">Tomcat</prop>
</props>
</property>
<!-- 注入数组 -->
<property name="nums">
<array value-type="java.lang.Double">
<value>100.11</value>
<value>100</value>
<value>10088</value>
</array>
</property>
</bean>
<bean id="bean_b" class="com.chou.spring.bean.MyBeanB">
<property name="beanA" ref="bean_a"/>
</bean>
<bean id="bean_c" class="com.chou.spring.bean.MyBeanC">
<!-- 注入Collection类型 -->
<property name="beanSet">
<set value-type="com.chou.spring.bean.MyBean">
<ref bean="bean_a" />
<ref bean="bean_b" />
</set>
</property>
<property name="beanList">
<list value-type="com.chou.spring.bean.MyBean">
<ref bean="bean_a" />
<ref bean="bean_b" />
</list>
</property>
<!-- null值注入 -->
<property name="money">
<null/>
</property>
</bean>
</beans>
String[] configs = new String[] {"applicationContext.xml"};
ApplicationContext cxt = new ClassPathXmlApplicationContext(configs);
MyBeanC c = cxt.getBean("bean_c",MyBeanC.class);
c.execute();
分享到:
相关推荐
Java Spring 框架是企业级Java应用开发的首选框架之一,其核心特性之一就是依赖注入(Dependency Injection,简称DI)。依赖注入是一种设计模式,它允许我们解耦组件,提高代码的可测试性和可维护性。Spring框架通过...
Spring框架作为一款优秀的轻量级Java应用开发框架,其核心理念之一就是依赖注入(Dependency Injection, DI)。依赖注入不仅能够帮助开发者降低代码间的耦合度,提高软件的可维护性和可扩展性,还能简化项目配置,...
Spring依赖注入是Spring框架的核心特性之一,它极大地简化了Java应用程序的开发,使得对象之间的依赖关系得以解耦,提高了代码的可测试性和可维护性。本文将深入探讨Spring依赖注入的底层实现机制。 首先,我们要...
其中,IoC和依赖注入(Dependency Injection, DI)是Spring框架最核心的部分之一。 #### 二、IoC容器概述 在传统的Java应用程序中,对象的创建和管理通常由程序员来完成。这种方式会导致代码之间存在高度耦合,难以...
Spring依赖注入是Spring框架的核心特性之一,它使得对象之间的依赖关系得以解耦,增强了代码的可测试性和可维护性。依赖注入(Dependency Injection,简称DI)的理念是,一个对象不应该负责寻找并创建它所依赖的对象...
Spring框架的依赖注入(Dependency Injection,简称DI)是其核心特性之一,它使得应用程序的组件之间可以松散耦合,增强了代码的可测试性和可维护性。在Spring框架中,DI通过控制反转(Inversion of Control,IoC)...
该教程首先会介绍Spring的基本概念,包括依赖注入(Dependency Injection,DI)和控制反转(Inversion of Control,IoC),这是Spring的核心设计理念,能够帮助开发者降低组件之间的耦合度,提高代码的可测试性和可...
Spring 框架的核心是控制反转(IOC)和依赖注入(DI),它可以将对象的创建和依赖关系管理,实现高内聚、低耦合的开发模式。 下面是 Spring 框架的核心知识点: 1. 控制反转(IOC):控制反转是 Spring 框架的...
Java 开发学习(六)----DI 依赖注入之 setter 及构造器注入解析 本文将详细介绍 Java 中的依赖注入(Dependency Injection,简称 DI),特别是 setter 注入和构造器注入两种方式的使用和实现。 一、DI 依赖注入 ...
在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本文将深入探讨Spring中的依赖注入实现方式,以及如何通过样例文件...
Spring框架的Dependency Injection(DI,依赖注入)是其核心特性之一,它允许开发者在运行时通过容器来管理对象及其依赖关系,而不是硬编码这些依赖。这样可以提高代码的可测试性和可维护性,降低了组件之间的耦合度...
**Spring 框架中的控制反转 (IoC) 和依赖注入 (DI)** 在软件开发中,控制反转(Inversion of Control,简称IoC)是一种设计原则,它将对象的创建和管理权从代码中剥离出来,转交给一个外部容器(如Spring框架)。...
在Spring框架中,依赖注入是核心特性之一,通过控制反转(Inversion of Control,IoC)实现了组件之间的解耦。 ### 依赖注入的基本概念 依赖注入允许开发者在不修改代码的情况下,通过配置来改变对象间的依赖关系。...
【Spring依赖注入详解】 ...总结,Spring的依赖注入机制是其核心特性之一,它极大地提高了代码的可读性、可维护性和可测试性。理解并熟练掌握依赖注入,能够帮助开发者构建更健壮、更灵活的Java应用。
Spring依赖注入是Spring框架的核心特性之一,它极大地简化了Java应用程序的开发,使得对象之间的依赖关系得以解耦,提高了代码的可测试性和可维护性。本文将深入探讨Spring依赖注入的概念、工作原理以及如何在实际...
在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种核心的设计模式,它允许我们创建松耦合的代码,提高软件的可测试性和可维护性。Spring4版本进一步优化了这一特性,使其更加灵活和强大。本篇文章将...
在深入探讨Spring框架中基于注解(Annotation)的依赖注入(Dependency Injection,简称DI)实现之前,我们首先需要理解几个核心概念:Spring框架、依赖注入、以及注解本身。 ### Spring框架简介 Spring框架是一个...
其中,依赖注入是Spring的核心特性之一,它使得代码更加灵活、可测试且易于维护。 依赖注入允许开发者将对象间的依赖关系解耦,不再由对象自身负责创建和查找依赖的对象,而是由外部容器(如Spring IoC容器)来管理...
在Spring框架中,依赖注入(Dependency Injection,DI)是一种核心设计模式,它使得对象之间的依赖关系得以解耦,提高了代码的可测试性和可维护性。本篇将详细讲解如何使用静态工厂方法进行依赖注入,结合提供的...