- 浏览: 241965 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
sweed0:
为何每一段代码都重复一次呢?
spring注解实例二 -
Gary_Huangpf:
- - 插件报错啊
Ext前台分页 -
ddvk2007:
版主 我想請問你所說的mapreduce是hadoop的還是g ...
MapReduce中的Shuffle和Sort分析 -
人可木:
好问章,楼主写的相当详细。。。多谢。。。
findbugs插件的安装与应用 -
hautbbs:
按照博主的方法启动调试出现jvm terminated.Ex ...
10分钟学会使用MyEclipse断点调试js
Ioc和他的作用,简单的来讲,就是由容器控制程序之间的关系,而不是由我们手动编写控制实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
下面通过添加用户的小例子具体来看,首先配置Spring的环境
1、加入spring的依赖包
(1).SPRING_HOME/dist/spring.jar
(2).SPRING_HOME/lib/log4j/log4j-1.2.14.jar
(3).SPRING_HOME/lib/jakarta-commons/commons-logging.jar
2、提供spring配置文件applicationContext.xml,一个典型的Spring项目需要创建一个或多个Bean配置文件,这些配置文件用于在Spring IOC容器里配置Bean,这个配置文件最好放在classpath目录下。
3、提供log4j.properties配置文件
创建项目,写Dao层接口IUserDao.java
- public interface IUserDao {
- public void InsertUser(String username,String password);
- }
Dao接口的实现类 UserDaoImpl.java
- public class UserDaoImpl implements IUserDao{
- @Override
- public void InsertUser(String username, String password){
- System.out.println("----UserDaoImpl --addUser----");
- }
- }
业务层接口IUserManager.java
- public interface IUserManager {
- public void addUser(String username,String password);
- }
业务层接口的实现UserManagerImpl.java
- public class UserManagerImpl implements IUserManager {
- private IUserDao userDao;
- @Override
- public void addUser(String username, String password) {
- userDao=new IUserDaoImpl();
- userDao.InsertUser(username,password);
- }
- }
其实从这里就可以看出,业务层其实也是依赖了Dao层的具体实现,没有起到解耦的作用。
Client.java
- public classClient {
- public static void main(String[] args) {
- IUserManager usermanager=new UserManagerImpl();
- userManager.addUser("wanghuan","password");
- }
- }
从客户端的代码里,我们也可以看出,客户端也还是依赖于业务层的具体实现。接下来我们使用IOC容器。就是将我们的对象放到配置文件里,让Spring知道,从而由Spring来帮我们管理。
Spring 框架的 IOC 容器采用两种方法实现:
(一)【setter方法注入】:通过 JavaBean的属性分配依赖性。
(二)【构造器注入】:依赖性以构造函数的形式提供,不以 JavaBean 属性的形式公开。
首先看setter方法注入,是IOC通过set方法将需要的对象注入。需要提供被注入对象的set方法。
- Public class UserManagerImpl implements UserManager {
- private IUserDao userDao;
- //set方法
- public void setUserDao(IUserDao userDao) {
- this.userDao = userDao;
- }
- @Override
- public void addUser(String username, String password) {
- //不需要实例化,直接可以使用
- userDao.InsertUser(username,password);
- }
- }
重点是配置Spring的核心配置文件applicationContext.xml,在配置文件中配置上userDao的信息,使得IOC容器自己将UserDao对象注入到UserManagerImpl中。
applicationContext.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"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd
- http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.0.xsd
- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
- <!--id名字自己取,class表示他代表的类,如果在包里的话需要加上包名-->
- <bean id="userManager" class="UserManagerImpl" >
- <!—property代表是通过set方法注入,ref的值表示注入的内容-->
- <property name="userDao" ref="userDao"/>
- </bean>
- <bean id="userDao" class="UserDaoImpl"/>
- </beans>
这样我们就可以看出,业务层里只出现了Dao层的接口,是依赖于接口,而没有依赖于真正的实现。客户端对业务层的依赖是同样道理,可以只依赖业务层接口,通过IOC注入解决。
下面看另一种通过构造器注入。这种方法不需要提供set方法,但需要提供构造方法。看代码:
- Public class UserManagerImpl implements UserManager {
- private IUserDao userDao;
- //构造函数
- public UserManagerImpl(IUserDao userDao) {
- this.userDao = userDao;
- }
- @Override
- public void addUser(String username, String password) {
- userDao.InsertUser(username,password);
- }
- }
配置文件也有不同:
applicationContext.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"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd
- http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.0.xsd
- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
- <bean id="userManager" class="UserManagerImpl" >
- <!—constructor-arg代表是通过构造函数注入,ref的值表示注入的内容-->
- <constructor-arg ref="userDao "/>
- </bean>
- <bean id="userDao" class="UserDaoImpl"/>
- </beans>
这两种注入方式,在客户端进行调用都是一样的。来看客户端代码:
- public class Client{
- public staticvoidmain(String[] args) {
- /*这句话就不用出现了
- IUserManager usermanager=new UserManagerImpl();
- */
- //使用Spring的工厂将ioc容器中的对象取出
- BeanFactory factory=newClassPathXmlApplicationContext("applicationContext.xml");
- //依赖于接口,不会出现具体实现
- IUserManager userManager=(IUserManager)factory.getBean("userManager");
- userManager.addUser("wanghuan", "password");
- }
- }
通过代码我们可以看出IOC依赖注入的好处:
1.对象之间的依赖关系,不由对象自身来负责,而是由容器依据配置文件动态建立,这样就很灵活,可配。
2.采用依赖注入,模块之间一定是松散耦合的
3.代码易维护易测试
如果不使用框架,我们传统的写法一般是自己建立工厂或者用单例来处理业务层与Dao层,而使用了Spring,这些工作我们就都不用管了,而且每层的代码都很清楚。这样就使得真正的业务流程更明确了。
转载自:http://zhangll98.iteye.com/blog/1551321
发表评论
-
spring AOP
2012-06-13 11:14 881先简单的说说spring aop使用的好处:利用AOP横向添加 ... -
spring IOC介绍
2012-06-13 10:55 1300首先想说说IoC(Inversion of ... -
spring概述
2012-06-13 10:52 777随着越来越多的项目 ... -
spring学习总结
2010-02-04 08:49 948先说说简单地使用Struts2做Web时的经历: 1.经常需要 ... -
spring注解实例二
2010-01-26 11:22 2338昨天对Spring注解有了一个整体认识,至少完成了一个简单的w ... -
spring注解实例一
2010-01-26 11:15 2925先来构建一个极为简单的web应用,从controller到da ... -
spring注解配置文件解析
2010-01-26 11:01 35481、applicationContext.xml ... -
使用 Spring 2.5 基于注解驱动的 Spring MVC(二)
2010-01-22 11:13 3400我们在 ② 处添加了一个 ModelMap 属性,其属性名为 ... -
使用 Spring 2.5 基于注解驱动的 Spring MVC(一)
2010-01-22 11:05 1330基于注解的配置有越来越流行的趋势,Spring 2.5 顺应这 ... -
spring注解详解
2010-01-22 09:57 13241.准备工作(1)导入common-annotations.j ... -
spring注解
2010-01-13 09:56 979Spring JSR-250注解 注释配 ... -
spring相关配置内容解析
2010-01-05 14:27 12941、web.xml配置文件: <? ... -
Spring MVC 配置【转】
2010-01-03 14:51 1033一,配置分发器 Dispatche ... -
spring mvc 学习笔记
2010-01-03 14:41 1135一、与struts的不同 1.Spr ... -
Spring Mvc快速入门
2010-01-03 14:20 1728Spring MVC是结构最清晰的MVC ... -
Spring 可代码简化操作类
2009-12-28 09:31 1036SimpleJdbcTemplate类是Jd ... -
Spring 命名参数操作类NamedParameterJdbcTemplate
2009-12-28 09:28 1764在传统的SQL语句中,参数都是用'?'占 ... -
Spring JdbcTemplate操作类
2009-12-24 10:42 27471.JdbcTemplate ...
相关推荐
spring ioc使用教程
Spring Ioc 使用java反射和代理
spring ioc容器初始化流程图 spring ioc容器依赖注入流程图 spring aop实现原理流程图
spring ioc指的是控制反转,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。交由Spring容器统一进行管理,从而实现松耦合
springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC...
spring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demo...
SpringIoc示例代码,SpringIoc示例代码,SpringIoc示例代码,SpringIoc示例代码
spring Ioc容器配置 IOC容器数据源配置 <!-- 配置数据源 --> destroy-method="close"> <value>org.gjt.mm.mysql.Driver <value>jdbc:mysql://localhost:3306/demo <value>root ...
spring ioc思维导图,让自己快速、详尽地了解spring ioc知识。
Spring ioc Spring ioc
以注解方式模拟Spring IoC AOP,了解Spring是如何实现的.
主要为大家详细解析了Spring中IoC优点与缺点,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
详细讲解了springioc的各种注入方式以及对应的java方式。讲解了springioc和DI的区别,以及注入特殊复杂的属性
Spring IoC加载流程讲解以及IoC思想和依赖倒置原则
SpringIOC经典Demo,绝对的经典.
Spring Ioc 注解 依赖注入
这是个模拟spring ioc的学习例子,是个java工程。有助于对aop和ioc的理解
spring的ioc容器详细讲解,理解springioc容器
springioc加载流程图.pdf
Spring IOC基础jar包