Helloworld之Spring依赖注入/控制反转(DI/IoC)版
作者:雨水, 日期:2014-10-29

摘要:本文主要用于培训刚開始学习的人理解Spring中的依赖注入的基本概念. 先介绍依赖注入的基本概念。然后以构造器注入为例实现了Helloworld实例。



Spring依赖注入/控制反转
在我们通常的编程中,假设类A要依赖类B。一般是由A来创建一个B的实例。而Spring将创建B的实例的工作交给Spring容器来完毕。然后注入A,因此称为依赖注入(DI, Dependency Injection)。这样的创建被调用者的工作不再由调用者来完毕,因此又称为控制反转(IoC, Inversion of Control)。
依赖注入将Bean以文件的形式组织在一起,减少了程序的耦合性。

实例之间的依赖关系由IoC容器负责管理。


依赖注入Helloworld实例
依赖注入的方式有多种,比方构造器注入,设值注入等,这里以构造器注入为例。


第一步:搭建Spring环境
通过直接下载jar包增加project或者通过Maven/Gradle来引入Spring的依赖jar包. 详细參考: http://spring.io/ 

第二步:编写详细类
1. 定义接口类MessageService.java
package cn.dennishucd;

public interface MessageService {
public String getMessage();
}

2. 编写接口的实现类MessageServiceImpl.java 
package cn.dennishucd;

public class MessageServiceImpl implements MessageService {
@Override
public String getMessage() {
return "Hello World!";
}
}

3. 编写服务消费类MessagePrinter.java
package cn.dennishucd;

public class MessagePrinter {
final private MessageService service; public MessagePrinter(MessageService service) {
this.service = service;
} public void printMessage() {
System.out.println(this.service.getMessage());
}
}

4. 编写主程序类HelloworldSpring.java
package cn.dennishucd;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class HelloworldSpring { public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("helloworld.xml");
MessagePrinter printer = (MessagePrinter) context.getBean("printer"); printer.printMessage(); ((ClassPathXmlApplicationContext)context).close();
}
}

第三步:编写spring配置文件
文件名称能够随意,这里命名为helloworld.xml,该文件放在src的根文件夹下。

<?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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <bean id="service" class="cn.dennishucd.MessageServiceImpl"/> <bean id="printer" class="cn.dennishucd.MessagePrinter">
<constructor-arg ref="service"/>
</bean>
</beans>

第四步:执行程序
执行程序,显示:"Hello World!"

程序解释:
(1) MessagePrinter要使用MessageService获取消息的服务,它并非直接在该类中new一个MessageService的详细实现类,而是提供一个注入接口,即这里的构造注入。
(2) 详细注入哪个MessageService的实现能够在spring的配置文件里进行配置,即通过<constructor-arg ref="service"/>来指定。而且这个详细实现类的实例化也由Spring的容器来实现。
(3) 这里仅仅是一个hello的消息服务样例,想象一下假设是用做系统的数据訪问服务。

数据訪问服务的消费者仅仅须要定义一个接口并提供注入方式。详细使用什么样的数据訪问实现就能够在配置文件里进行配置。假设系统须要更换数据訪问实现,仅仅须要改动配置文件里要注入的详细数据訪问实现就可以。

这样实现了面向接口编程的松耦合。

(4) 主程序创建了一个Spring应用上下文,直接从应用上下文中获取到MessagePrinter消费者的实例。然后调用对应的方法。


參考资料:
1. http://spring.io/  Spring官网
2. http://blog.csdn.net/a906998248/article/details/7514085  Spring 的核心机制:依赖注入(控制反转)
3. http://outofmemory.cn/code-snippet/3670/spring-inject-by-annotation  Spring依赖注入:注解注入总结

Helloworld之Spring依赖注入/控制反转(DI/IoC)版的更多相关文章

  1. Spring 依赖注入控制反转实现,及编码解析(自制容器)

    定义: 在运行期,由外部容器动态的将依赖对象动态地注入到组件中. 两种方式: 手工装配 -set方式 -构造器 -注解方式 自动装配(不推荐) 1利用构造器 2set方法注入 dao: package ...

  2. PHP关于依赖注入(控制反转)的解释和例子说明

    PHP关于依赖注入(控制反转)的解释和例子说明 发表于2年前(2014-03-20 10:12)   阅读(726) | 评论(1) 8人收藏此文章, 我要收藏 赞2 阿里云双11绽放在即 1111 ...

  3. C#依赖注入控制反转IOC实现详解

    原文:C#依赖注入控制反转IOC实现详解 IOC的基本概念是:不创建对象,但是描述创建它们的方式.在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务.容器负责将这些联系在一起. ...

  4. spring依赖注入(反转控制)

    SPRING依赖注入机制(反转控制)解析 Spring能有效地组织J2EE应用各层的对象.不管是控制层的Action对象,还是业务层的 Service对象,还是持久层的DAO对象,都可在Spring的 ...

  5. laravel5.2总结--服务容器(依赖注入,控制反转)

    1.依赖 我们定义两个类:class Supperman 和 class Power,现在我们要使用Supperman ,而Supperman 依赖了Power class Supperman { p ...

  6. 依赖注入&控制反转

    IoC——Inversion of Control  控制反转DI——Dependency Injection   依赖注入 要想理解上面两个概念,就必须搞清楚如下的问题: 参与者都有谁? 依赖:谁依 ...

  7. Spring 框架学习—控制反转(IOC)

        Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建. 简单来说,Spring是一个分层的JavaSE/EEfull-st ...

  8. Spring学习3—控制反转(IOC)Spring依赖注入(DI)和控制反转(IOC)

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

  9. Benefits of Using the Spring Framework Dependency Injection 依赖注入 控制反转

    小结: 1. Dependency Injection is merely one concrete example of Inversion of Control. 依赖注入是仅仅是控制反转的一个具 ...

随机推荐

  1. HDU 2102 A计划 (三维的迷宫BFS)

    题目链接:pid=2102">传送门 题意: 三维的一个迷宫,起点在第一层的S(0,0,0)处,问是否能在规定的时间内走到第二层的P 处.'*'代表不能走,'.'代表能够走,'#'代表 ...

  2. golang webservice[ json Martini webframe]

    golang webservice[ json Martini webframe] https://github.com/brunoga/go-webservice-sample 自己修改了一下例子, ...

  3. golang filepath.Walk遍历指定目录下的所有文件

    package main import ( "fmt" "os" "path/filepath" ) func walkFunc(path ...

  4. 洛谷 P1760 通天之汉诺塔

    P1760 通天之汉诺塔 题目背景 直达通天路·小A历险记第四篇 题目描述 在你的帮助下,小A成功收集到了宝贵的数据,他终于来到了传说中连接通天路的通天山.但是这距离通天路仍然有一段距离,但是小A突然 ...

  5. 2.1 使用eclipse4.4 搭建 maven简单结构项目。

    1.前言 1.本博客面向0基础开发人员. 2.本博客为系列博客.<1.X>系列为服务器数据库相关技术,前几章为简单搭建linux+tomcat+mysql+nginx+redis.< ...

  6. Codeforces 559A Gerald&#39;s Hexagon 数三角形

    题意:按顺序给出一个各内角均为120°的六边形的六条边长,求该六边形能分解成多少个边长为1的单位三角形. 把单位三角形面积看做1,实际上就是求六边形面积.随便找六边形的三条互相不相邻的边,分别以这三条 ...

  7. iptables转发安卓手机热点的数据到指定的端口

    iptables转发安卓手机热点的数据到指定的端口 手机安装了VPN,可以上GOOGLE的那种.然后我打开手机的热点,连上笔记本,想让本本上个google 没想到被GFW挡住了.看了一下手机的网络工作 ...

  8. Android 图片缓存处理

    异步下载 / 本地缓存 异步下载 大家都知道,在Android应用中UI线程5秒没响应的话就会抛出无响应异常,对于远程获取大的资源来说,这种异常还是很容易就会抛出来的,那么怎么避免这种问题的产生.在a ...

  9. Python 极简教程(七)列表 list

    由于列表过于重要,请认真看完并保证所有代码都敲过一遍. 什么是列表 列表是 Python 中最常用的数据结构,也是一种数据类型,其样式如下: li = [1, 2, 3, 'a', 'b'] 列表是一 ...

  10. 洛谷 P1205 [USACO1.2]方块转换 Transformations

    P1205 [USACO1.2]方块转换 Transformations 题目描述 一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案.写一个程序来找出将原始 ...