文档章节

浅析 Spring IoC - 注入方式

pradosoul
 pradosoul
发布于 2015/10/19 16:52
字数 879
阅读 645
收藏 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
闵行
程序员
私信 提问
加载中
请先登录后再评论。
Promises/A 和 when() 实现--When.js

When.js 是 cujojs 的轻量级的 Promises/A 和 when() 实现,从 wire.js 的异步核心和 cujojs 的 IOC 容器派生而来。包含很多其他有用的 Promiss 相关概念,例如联合多个 promiss、mapping 和...

匿名
2013/02/15
7.4K
0
轻量级PHP框架--MonkeyPHP

MonkeyPHP(简称 MK)是一个完全面向对象的轻量级 PHP 框架!主要特点: 一、目录规范,容易部署。 二、支持 MVC 和 REST 等web架构。 三、路由既高效强大,又易于定制。 四、松耦合设计,易...

shalalal
2012/10/23
2.1K
0
高效 Java Web 开发框架--JessMA

JessMA 是功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hibernate、MyBatis 与 JDBC DAO 组件),集成了 Action 拦截...

伤神小怪兽
2012/11/13
9.2K
3
LightWeb--LightWeb

使用较少的外部框架, 搭建轻型Web架构. 已经或将包含: 轻型依赖注入的实现 Front Controllerf模式实现Http Request的处理,完全摆脱Web Form和ASP.Net Repository实现持久层。 持续完善中, 希...

予沁安
2012/11/21
1.4K
0
php开源框架--CorePHP

简介: CorePHP框架是一个快速,安全,灵活的php开源框架,主要是为了简化和快速开发小型项目和开源系统二次开发而诞生。它既可以完美的支持MVC模式,又可以不受限制的支持传统编程模式。它是...

shooke
2012/12/27
2.8K
1

没有更多内容

加载失败,请刷新页面

加载更多

Java圈里,什么样的人,会越来越穷?

“我不想做 Java 了,想去做大数据!但我一个双非本科,能行么?“ 我还挺费解,为什么疫情之后,很多粉丝都想去做大数据, 但仔细想想原因太简单。 因为做大数据值钱、岗位还多。(是的,成...

倪升武
今天
2
0
Java 8 - Stream 集合操作快速上手

点击上方Java学习指南关注公众号 每天阅读Java干货文章 链接:www.jianshu.com/p/9fe8632d0bc2 目录 Stream 简介 为什么要使用 Stream 实例数据源 Filter Map FlatMap Reduce Collect Option...

xqnode
前天
19
0
工作流引擎的工作原理与功能

协同工作流引擎(Synchro flow)基于企业流程自动化基础的平台的产品同时也是企业流程再造的核心产品,并且提供以业务建模、流程设计、流程仿真、界面设计、业务整合、部署执行、系统管理、业...

osc_3nr0mda4
34分钟前
0
0
第三本 PDF !!!程序员必知核心基础知识

我们可以感觉出来,计算机专业的门槛正在逐渐增高,人与人之间的差距在逐渐拉大,今天和 一位阿里的大龄程序员聊天后发现,他也觉得自己底层知识很薄弱,正在找时间恶补,也在感叹时间管理的...

osc_htns3spg
35分钟前
9
0
【CSS】679- rem,em,px的区别和使用场景

作者:大前端小菜鸟 来源: cnblogs.com/hyns/p/12380944.html 作rem布局原理深度理解(以及em/vw/vh) 一、前言 我们h5项目终端适配采用的是淘宝那套《Flexible实现手淘H5页面的终端适配》方...

前端自习课
前天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部