文档章节

浅析 Spring IoC - 注入方式

pradosoul
 pradosoul
发布于 2015/10/19 16:52
字数 879
阅读 285
收藏 9
点赞 0
评论 0

1. IoC 容器的概念

    IoC 容器指 具有依赖注入功能的容器,IoC 容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。应用程序无需直接在代码中 new 相关对象,而是由 IoC 容器进行组装。在Spring 中 BeanFactory 是 IoC 容器的实际代表者。

    Spring IoC 容器通过读取配置文件中配置元数据,通过元数据对用中的各个对象进行实例化及装配。一般使用基于 xml 配置文件进行配置元数据,而且 spring 与 配置文件 完全解耦,可以使用其他方式进行配置元数据,比如 注解、基于 Java 文件的、基于属性文件的配置。。

2. Bean 的概念

    由 IoC 容器管理的那些 对象称之为 Bean,Bean 就是由 Spring 容器初始化、装配及管理的对象,除此之外,bean 与应用程序中其他对象没有什么区别了。

3. 下面我们搭建一个项目来演示一下Spring IoC 的基本使用

(环境 JDK 1.7.0_79,Eclipse 以及 spring 4.2.2 release,注意:该版本spring 只支持 JDK 1.6+

(下载地址:http://repo.spring.io/release/org/springframework/spring/))

使用 Eclipse 新建 Java project,命名为 Spring_IOC,同时import spring的 jar 包。

  

    User.java

public class User {
	private int userId;
	private String username;// 用户姓名
	private String sex;// 性别
	private Date birthday;// 出生日期
	private String address;// 地址
	private String detail;// 详细信息
	private Float score;// 成绩
	
	//getter() and setter()...
}

    UserService.java

public interface UserService {
	public void addUser(User user);
}

    UserServiceImpl.java

public class UserServiceImpl implements UserService {

	private UserDAO userDAO;
	
	public UserDAO getUserDAO() {
		return userDAO;
	}
	
	public void setUserDAO(UserDAO userDAO) {
		this.userDAO = userDAO;
	}

	@Override
	public void addUser(User user) {
		this.userDAO.saveUser(user);
	}
}

    UserDAO.java

public interface UserDAO {
	public void saveUser(User user);
}

    UserDAOImpl.java

public class UserDAOImpl implements UserDAO {

	@Override
	public void saveUser(User user) {
		System.out.println("save user to Database");
	}
}

    UserServiceTest.java (Junit test case)

public class UserServiceTest {

	@Before
	public void setUp() throws Exception {
	}

	@Test
	public void testAddUser() throws Exception {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
		
		UserServiceImpl service = (UserServiceImpl) ctx.getBean("userService");
		
		User user = new User();
		user.setUsername("Olive");
		service.addUser(user);
	}
}

    Beans.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="userDAO" class="com.dao.impl.UserDAOImpl" />

    <bean id="userService" class="com.service.impl.UserServiceImpl">
        <property name="userDAO" ref="userDAO" />
    </bean>
</beans>

4. 注入方式

    OK,Demo搭建起来了,下面讲一下 IoC 容器的几种注入方式:接口注入、构造方法、setter方法注入(前两者用的比较少)。

    (1)构造方法注入:

    首先,在依赖对象(UserServiceImpl)中构建显式的构造方法,构造方法包含 被依赖对象(UserDAOImpl)。在配置文件(beans.xml)中配置好 userDAOImpl 和 UserDAOImpl,如下:

    在 UserServiceImpl 中添加构造方法:

//constructor
public UserServiceImpl(UserDAO userDAO) {
	super();
	this.userDAO = userDAO;
}

    修改配置文件:

<?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.xsd">

    <bean id="userDAO" class="com.dao.impl.UserDAOImpl" />

    <bean id="userService" class="com.service.impl.UserServiceImpl">
        <!-- <property name="userDAO" ref="userDAO" /> -->
        
        <!-- constructor -->
        <constructor-arg>
        	<ref bean="userDAO"/>
        </constructor-arg>
    </bean>
</beans>

    (2)setter 方法注入:

    要求在依赖对象(UserServiceImpl)中提供被依赖对象(UserDAOImpl)的setter() 方法,then 在配置文件 <bean><property /></bean> property中配置被依赖对象。

public class UserServiceImpl implements UserService {

	private UserDAO userDAO;
	
	public UserDAO getUserDAO() {
		return userDAO;
	}
	
	public void setUserDAO(UserDAO userDAO) {
		this.userDAO = userDAO;
	}

	//constructor
//	public UserServiceImpl(UserDAO userDAO) {
//		super();
//		this.userDAO = userDAO;
//	}

	@Override
	public void addUser(User user) {
		this.userDAO.saveUser(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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="userDAO" class="com.dao.impl.UserDAOImpl" />

    <bean id="userService" class="com.service.impl.UserServiceImpl">
        <property name="userDAO" ref="userDAO" />
        
        <!-- constructor -->
        <!-- <constructor-arg>
        	<ref bean="userDAO"/>
        </constructor-arg> -->
    </bean>
</beans>

    (3)接口注入:由于笔者自己也不太清楚,先暂时空着,待以后弄清楚后补充

© 著作权归作者所有

共有 人打赏支持
pradosoul
粉丝 6
博文 40
码字总数 37445
作品 0
闵行
程序员
Spring IoC(更新中)

概念 IoC(控制反转,也叫依赖注入DI)是Spring的核心,几乎Spring的所有组件都要建立在此基础之上,包括AOP,声明式事务,SpringMVC等等。那么IoC的主要目的是什么呢?两个字“解耦”。为什么...

互联网小龙虾
2014/03/04
0
0
Spring IOC知识点一网打尽!

前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 单例模式你会几种写法? 工厂模式理解了没有? 在刷Spring书籍的时候花了点时间去学习了单例模式和工...

Java3y
05/22
0
0
Spring IoC & DI

IOC诞生的历史 在没有IoC时,关联不同模块是通过类实例实现的,代码可能是这样子的: 当YourServiceImpl的接口不变时,只需要根据业务需要更换不同的YourService实现类即可。一旦更换实现类时...

classfly
06/18
0
0
spring浅析(一)

一、什么是spring? spring是一个基于Java的应用平台,是一个开源的框架,他同EJB一样都是为了为松耦合的POJO类提供中间服务件,框架将服务注入给POJO类,POJO类无需关注如何去连接服务,从而达...

J星星点灯
2017/09/14
0
0
Spring框架笔记(三)——Spring容器、属性注入和构造器注入详解

Spring 容器 在 Spring IOC 容器读取 Bean 配置创建 Bean 实例之前, 必须对它进行实例化. 只有在容器实例化后, 才可以从 IOC 容器里获取 Bean 实例并使用. Spring 提供了两种类型的 IOC 容器...

HappyBKs
2015/07/12
0
5
IOC/AOP工具 - jBeanBox

jBeanBox是一个微形但功能较齐全的IOC/AOP工具适用于JAVA7+,利用了Java的初始化块实现的Java配置代替XML。jBeanBox采用Apache License 2.0开源协议。 其他一些IOC/AOP框架的问题: 1)Sprin...

yong9981
2016/07/25
0
14
1 Spring核心:IoC容器的实现

依赖控制反转的实现有很多种方式。在Spring中,IoC容器是实现这个模式的载体, 它可以在对象生成或初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入对方...

qq_18150351
04/24
0
0
浅析 Spring IoC - 基础概念

IoC是什么? IoC(Inversion of Control)即控制反转,不是什么技术,而是一种设计思想。在Java开发中,IoC 意味着将你设计好的对象交给容器去控制,而不是传统的在对象内部直接控制(比如说...

pradosoul
2015/10/15
180
0
1000行代码读懂Spring(一)- 实现一个基本的IoC容器

引言 最近在读Spring源码,但是Spring代码层次嵌套太多,读起来有很大跳跃性,我有个朋友甚至开玩笑说,读Spring得拿纸笔,把方法和层次都写下来。 其实Spring我已经接触很久了,记得大学有个...

黄亿华
2014/01/13
0
37
SpringBoot的幕后推手...

一、背景   这两年随着微服务的盛行,SpringBoot框架水到渠成的得到了高曝光,作为程序猿的我们,现在要是不知道一点SpringBoot相关的东西,貌似出去找工作都会被深深地鄙视,不过在我们开...

Java工程师-Distance
06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

微信小程序Java登录流程(ssm实现具体功能和加解密隐私信息问题解决方案)

文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。 一、登录流程图 二、小程序客户端 doLogin:function(callback = () =>{}){let ...

公众号_好好学java
35分钟前
0
1
流利阅读笔记28-20180717待学习

“我不干了!” 英国脱欧大臣递交辞呈 雪梨 2018-07-17 1.今日导读 7 月 6 日,英国政府高官齐聚英国首相的官方乡间别墅——契克斯庄园,讨论起草了一份关于英国政府脱欧立场的白皮书。可是没...

aibinxiao
今天
6
0
OSChina 周二乱弹 —— 理解超算排名这个事,竟然超出了很多人的智商

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @-冰冰棒- :分享Ed Sheeran/Beyoncé的单曲《Perfect Duet (with Beyoncé)》 《Perfect Duet (with Beyoncé)》- Ed Sheeran/Beyoncé 手机...

小小编辑
今天
138
7
Android 获取各大音乐平台的真实下载地址

废话 电脑使用谷歌浏览器或者QQ浏览器的时候。。。。。。。说不清楚,还是看图吧 大概意思就是,只要网页上需要播放,只要能播放并且开始播放,这个过程就肯定会请求到相关的音乐资源,然后就...

她叫我小渝
今天
0
0
shell中的函数、shell中的数组、告警系统需求分析

shell中的函数 格式: 格式: function f_name() { command } 函数必须要放在最前面 示例1(用来打印参数) 示例2(用于定义加法) 示例3(用于显示IP) shell中的数组 shell中的数组1 定义数...

Zhouliang6
今天
2
0
用 Scikit-Learn 和 Pandas 学习线性回归

      对于想深入了解线性回归的童鞋,这里给出一个完整的例子,详细学完这个例子,对用scikit-learn来运行线性回归,评估模型不会有什么问题了。 1. 获取数据,定义问题     没有...

wangxuwei
今天
1
0
MAC安装MAVEN

一:下载maven压缩包(Zip或tar可选),解压压缩包 二:打开终端输入:vim ~/.bash_profile(如果找不到该文件新建一个:touch ./bash_profile) 三:输入i 四:输入maven环境变量配置 MAVEN_HO...

WALK_MAN
今天
0
0
33.iptables备份与恢复 firewalld的9个zone以及操作 service的操作

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 10.19 iptables规则备份和恢复: ~1. 保存和备份iptables规则 ~2...

王鑫linux
今天
2
0
大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
今天
1
1
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部