文档章节

浅析 Spring IoC - 注入方式

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

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

本文spring libs 地址:https://github.com/yizhiamumu/springlibs Spring 能帮我们做什么 ①.Spring 能帮我们根据配置文件创建及组装对象之间的依赖关系。 ②.Spring 面向切面编程能帮助我们...

一只阿木木
08/16
0
0
Spring IOC知识点一网打尽!

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

Java3y
05/22
0
0
Spring IoC(更新中)

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

互联网小龙虾
2014/03/04
0
0
Spring IOC源码流程解析

Spring是一个轻量级的java开发框架,主要是简化java工程师的开发过程,其主要的模块是IOC和AOP。何为IOC?Inversion of control,控制反转。什么是控制?控制为什么需要反转?这些都是我们要...

fancy宸
07/12
0
0
【死磕 Spring】----- IOC 之深入理解 Spring IoC

版权声明:版权声明:转载前请留言获得作者许可,转载后标明作者 chenssy 和原文出处。原创不易,感谢您的支持 https://blog.csdn.net/chenssy/article/details/82343456 在一开始学习 Spri...

chenssy
09/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MariaDB 服务器在 MySQL Workbench 备份数据的时候出错如何解决

服务器是运行在 MariaDB 10.2 上面的,在使用 MySQL Workbench 出现错误: mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"'......

honeymose
今天
3
0
apache顶级项目(二) - B~C

apache顶级项目(二) - B~C https://www.apache.org/ Bahir Apache Bahir provides extensions to multiple distributed analytic platforms, extending their reach with a diversity of s......

晨猫
今天
6
0
day152-2018-11-19-英语流利阅读

“超级食物”竟然是营销噱头? Daniel 2018-11-19 1.今日导读 近几年来,超级食物 superfoods 开始逐渐走红。不难发现,越来越多的轻食餐厅也在不断推出以超级食物为主打食材的健康料理,像是...

飞鱼说编程
今天
13
0
SpringBoot源码:启动过程分析(二)

接着上篇继续分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 一样的,我们先把时序图贴上来,方便理解: 二.源码分析 回顾一下,前面我们分析到了下...

Jacktanger
昨天
4
0
Apache防盗链配置,Directory访问控制,FilesMatch进行访问控制

防盗链配置 通过限制referer来实现防盗链的功能 配置前,使用curl -e 指定referer [root@test-a test-webroot]# curl -e "http://www.test.com/1.html" -x127.0.0.1:80 "www.test.com/1.jpg......

野雪球
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部