`

Spring核心(三)IoC使用

阅读更多

上篇文章介绍了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

Java代码 
  1. public interface IUserDao {  
  2.           public void InsertUser(String username,String password);  
  3. }  

 

Dao接口的实现类 UserDaoImpl.java

Java代码 
  1. public class UserDaoImpl implements IUserDao{  
  2.          @Override  
  3.          public void InsertUser(String username, String password){               
  4.               System.out.println("----UserDaoImpl --addUser----");  
  5.          }  
  6.  }  


 

业务层接口IUserManager.java

Java代码 
  1. public interface IUserManager {  
  2.           public void addUser(String username,String password);  
  3. }  

 

业务层接口的实现UserManagerImpl.java

Java代码 
  1. public class UserManagerImpl implements IUserManager {  
  2.       private IUserDao  userDao;  
  3.       @Override  
  4.       public void addUser(String username, String password) {                  
  5.             userDao=new IUserDaoImpl();  
  6.             userDao.InsertUser(username,password);  
  7.       }  
  8.  }  

 

其实从这里就可以看出,业务层其实也是依赖了Dao层的具体实现,没有起到解耦的作用。

 

Client.java

Java代码 
  1. public classClient {  
  2.     public static void main(String[] args) {   
  3.         IUserManager usermanager=new UserManagerImpl();  
  4.         userManager.addUser("wanghuan","password");  
  5.     }  
  6. }  

 

从客户端的代码里,我们也可以看出,跟上篇文章的例子是一样的,客户端也还是依赖于业务层的具体实现。接下来我们使用IOC容器。

使用IOC容器很简单,就是将我们的对象放到配置文件里,让Spring知道,从而由Spring来帮我们管理。

Spring 框架的 IOC 容器采用两种方法实现:

(一)【setter方法注入】:通过 JavaBean的属性分配依赖性。

(二)【构造器注入】:依赖性以构造函数的形式提供,不以 JavaBean 属性的形式公开。

首先看setter方法注入,是IOC通过set方法将需要的对象注入。需要提供被注入对象的set方法。

 

Java代码 
  1. Public  class  UserManagerImpl  implements  UserManager {  
  2.     private  IUserDao  userDao;  
  3.     //set方法     
  4.     public void  setUserDao(IUserDao  userDao) {  
  5.        this.userDao = userDao;  
  6.     }  
  7.     @Override  
  8.     public void addUser(String username, String password) {               
  9.       //不需要实例化,直接可以使用  
  10.       userDao.InsertUser(username,password);  
  11.   }  
  12. }  

 

重点是配置Spring的核心配置文件applicationContext.xml,在配置文件中配置上userDao的信息,使得IOC容器自己将UserDao对象注入到UserManagerImpl中。

applicationContext.xml

 

Html代码 
  1. <?xml version="1.0"encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.          xmlns:aop="http://www.springframework.org/schema/aop"  
  5.          xmlns:tx="http://www.springframework.org/schema/tx"  
  6.          xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd  
  7.           http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.0.xsd  
  8.           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">  
  9. <!--id名字自己取,class表示他代表的类,如果在包里的话需要加上包名-->  
  10. <bean id="userManager"  class="UserManagerImpl" >  
  11.     <!—property代表是通过set方法注入,ref的值表示注入的内容-->  
  12.      <property  name="userDao"  ref="userDao"/>       
  13.  </bean>    
  14. <bean id="userDao"  class="UserDaoImpl"/>    
  15. </beans>  

 

这样我们就可以看出,业务层里只出现了Dao层的接口,是依赖于接口,而没有依赖于真正的实现。客户端对业务层的依赖是同样道理,可以只依赖业务层接口,通过IOC注入解决。

下面看另一种通过构造器注入。这种方法不需要提供set方法,但需要提供构造方法。看代码:

 

Java代码 
  1. Public  class  UserManagerImpl  implements  UserManager {  
  2.     private  IUserDao  userDao;  
  3.     //构造函数  
  4.     public  UserManagerImpl(IUserDao  userDao) {  
  5.        this.userDao = userDao;  
  6.     }    
  7.         @Override  
  8.     public void addUser(String username, String password) {               
  9.        userDao.InsertUser(username,password);  
  10.     }  
  11. }  

 

配置文件也有不同:

applicationContext.xml

 

Html代码 
  1. <?xml version="1.0"encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.          xmlns:aop="http://www.springframework.org/schema/aop"  
  5.          xmlns:tx="http://www.springframework.org/schema/tx"  
  6.          xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd  
  7.           http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.0.xsd  
  8.           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">  
  9. <bean id="userManager" class="UserManagerImpl" >  
  10.     <!—constructor-arg代表是通过构造函数注入,ref的值表示注入的内容-->  
  11.     <constructor-arg  ref="userDao "/>       
  12.  </bean>    
  13. <bean id="userDao" class="UserDaoImpl"/>    
  14. </beans>  

 

这两种注入方式,在客户端进行调用都是一样的。来看客户端代码:

 

Java代码 
  1. public  class  Client{  
  2. public staticvoidmain(String[] args) {   
  3.       /*这句话就不用出现了 
  4.              IUserManager  usermanager=new UserManagerImpl(); 
  5.       */  
  6.        //使用Spring的工厂将ioc容器中的对象取出  
  7.        BeanFactory factory=newClassPathXmlApplicationContext("applicationContext.xml");  
  8.        //依赖于接口,不会出现具体实现   
  9.        IUserManager userManager=(IUserManager)factory.getBean("userManager");  
  10.        userManager.addUser("wanghuan""password");  
  11.     }  
  12. }  


 

上篇文章的解耦过程于上文相同,都是将对象交与IOC容器管理,避免在程序中出现具体实现。通过代码我们可以看出IOC依赖注入的好处:

1.对象之间的依赖关系,不由对象自身来负责,而是由容器依据配置文件动态建立,这样就很灵活,可配。

2.采用依赖注入,模块之间一定是松散耦合的

3.代码易维护易测试

如果不使用框架,我们传统的写法一般是自己建立工厂或者用单例来处理业务层与Dao层,而使用了Spring,这些工作我们就都不用管了,而且每层的代码都很清楚。这样就使得真正的业务流程更明确了。

20
3
分享到:
评论
17 楼 aleijie 2012-06-12  
这篇文章,我感觉一点用都没有,呵呵,
        你说的,基本没有人会,我看了很多书都这样写,但是还不知道怎么实现的,
IUserManager userManager=(IUserManager)factory.getBean("userManager");
在整整的ioc中,我不知道iuserManager这个对象,那应该怎么注入对象 
16 楼 mixer_a 2012-06-08  
简单、易懂,不错
15 楼 dyllove98 2012-06-08  
百事加雪碧 写道
对于学基础,比去买一本介绍spring的书要学习快多了,多谢分享!

14 楼 1040538708 2012-06-08  
大厦夫妇随碟附送电风扇
13 楼 百事加雪碧 2012-06-07  
对于学基础,比去买一本介绍spring的书要学习快多了,多谢分享!
12 楼 jlins_you 2012-06-07  
feijing 写道
spring,deny,sgsoft,

11 楼 jlins_you 2012-06-07  
很不错
10 楼 a215318036 2012-06-06  
a215318036 写道
aijuans 写道
写的不错哦.



三的发生的发生地发


三对放放风放放风放放风放放风放放风反反复复反反复复
9 楼 a215318036 2012-06-06  
aijuans 写道
写的不错哦.



三的发生的发生地发
8 楼 feijing 2012-06-06  
spring,deny,sgsoft,
7 楼 wtu_Eternity 2012-06-06  
好文章,完全展示了依赖注入思想!
6 楼 qinglongyun 2012-06-06  
5 楼 dyllove98 2012-06-05  
写的不错,赞一个
4 楼 I`amYuChuang 2012-06-05  
对基础点的Spring有了一个文字化的理解。thks!
3 楼 slwen963 2012-06-05  
非常受益多谢了呵呵
2 楼 myemptyname 2012-06-05  
:D    
1 楼 aijuans 2012-06-05  
写的不错哦.

相关推荐

    Spring核心学习IOC部分

    在Spring框架中,IOC(Inversion of Control,控制反转)是其核心概念之一,它改变了传统应用程序中的对象创建和管理方式。本学习资料主要聚焦于Spring的IOC容器,特别是从最基本的BeanFactory开始,逐步深入理解...

    Spring 5.2.9的IOC核心jar包

    这个压缩包包含的是Spring框架的IOC(Inversion of Control)核心组件的jar包,是理解和使用Spring进行应用程序开发的基础。 **IOC容器** IOC,或称DI,是Spring的核心特性,它使得开发者可以将对象的创建和管理...

    springIoc实现原理

    Spring Ioc(Inversion of Control,控制反转)是Spring框架的核心特性之一,它改变了传统应用程序中对象的创建和管理方式。在传统的软件设计中,对象的创建和依赖关系的维护通常由代码自身来完成,而在Spring Ioc中...

    Spring核心-IOC(3)

    在Spring框架中,IOC(Inversion of Control,控制反转)是其核心概念之一,它改变了传统应用程序中的对象创建和管理方式。本篇文章将深入探讨Spring的IOC容器以及它如何通过自动装配(Autowired)来实现依赖注入,...

    springIOC核心组件分析.vsdx

    spring-core:核心模块 依赖注入IOC和DI的最基本实现 spring-beans:Bean工厂与装配 spring-context:上下文,即IOC容器 spring-context-support:对IOC的扩展,以及IOC子容器 spring-context-indexer:类管理组件和...

    springioc和spring aop

    Spring框架是Java开发中不可或缺的一部分,它通过提供两种核心特性——控制反转(IoC)和面向切面编程(AOP)来简化应用的构建。理解并掌握这两种技术对于任何Java开发者来说都至关重要。 **控制反转(IoC)**,也...

    以注解方式模拟Spring IoC AOP

    在Spring中,通常通过以下三种注解实现IoC: - `@Autowired`:自动装配,Spring会根据类型或名称找到合适的bean进行注入。 - `@Qualifier`:当有多个相同类型的bean时,用于指定注入哪一个。 - `@Resource`:基于...

    spring核心IOC以及DI

    【Spring核心IOC以及DI】是Spring框架中的关键概念,它们是Spring实现控制反转(Inversion of Control,简称IOC)和依赖注入(Dependency Injection,简称DI)的基石。这两个概念是Spring框架的核心,使得应用程序的...

    Spring-ioc-jar

    Spring IOC,全称为Inversion of Control,中文常被称为“控制反转”,是Spring框架的核心特性之一。这个概念在软件设计中引入了一种新的依赖管理方式,它将对象的创建和管理权交给了容器,使得开发者可以更专注于...

    Spring IOC AOP MVC 简单例子

    在这个简单的例子中,`Spring IOC AOP MVC 简单例子`可能是整个项目的整合示例,它将上述三个核心组件结合在一起,演示了如何在一个实际的Web应用中使用Spring。这个示例可能会包括一个简单的用户登录功能,展示如何...

    Spring概述与IOC.docx

    6. **模块化设计**:Spring 框架由多个模块组成,如核心容器、数据访问/集成、Web 模块等,开发者可以根据需求选择使用,避免了“大一统”框架带来的复杂性。 7. **可扩展性和维护性**:Spring 通过运行时组装组件...

    spring_ioc spring ioc

    ### Spring IoC容器的核心概念与应用 #### 一、IoC基本定义 IoC(Inversion of Control,控制反转)是一种设计思想,在Spring框架中主要体现在这样一种方式:原本在程序代码中由开发者自己控制的对象的创建过程以及...

    Spring ioc Spring ioc

    它是Spring框架的核心特性,旨在减少代码间的耦合,提高软件组件的可复用性和可测试性。通过IOC,应用程序的控制权从组件自身转移到了容器(如Spring的ApplicationContext),使得组件不再需要自己管理依赖关系,...

    spring ioc

    标题 "Spring IOC" 描述了我们讨论的核心主题——Spring 框架中的依赖注入(Inversion of Control,简称 IOC)机制。Spring 是一个广泛应用的 Java 应用开发框架,其核心特性之一就是IOC,它极大地简化了软件组件...

    如何导入Spring的IOC核心容器.docx

    最后,我们需要在Java代码中获取并使用Spring的IOC核心容器。通常,我们通过创建`ApplicationContext`实例来获取容器,然后使用`getBean`方法来根据bean的ID获取对象。在给定的代码片段中,有以下两种方式来获取bean...

    Spring源码分析_Spring_IOC

    对于Spring的使用者而言,IOC容器不仅是管理Bean(即应用中的对象实例)生命周期的中心,同时也是实现依赖注入(Dependency Injection,DI)的关键所在。在Spring框架中,IOC容器扮演着至关重要的角色,它负责管理...

    Spring-IOC实现

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它将对象的创建和管理权交由Spring容器处理,使得开发者可以更专注于业务逻辑的编写,而不是对象的生命周期管理。下面,我们将深入探讨Spring...

    spring ioc和aop原理流程图(详细)

    Spring 框架是Java开发中的核心框架,它主要由两个关键部分组成:IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。这两个概念是Spring框架的核心特性,极大地简化了企业...

    Spring的ioc小案例

    本案例主要探讨的是Spring框架的核心特性之一——依赖注入(Dependency Injection,简称DI),通常也被称为IOC(Inversion of Control,控制反转)。通过这个小案例,我们可以深入理解Spring如何实现IoC以及属性注入...

Global site tag (gtag.js) - Google Analytics