`
古镇灵狐
  • 浏览: 3616 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring——依赖注入

 
阅读更多

http://blog.csdn.net/lishuangzhe7047/article/details/20740835

http://blog.163.com/taodengwen@126/blog/static/87199341201191383429693/

 

 spring框架为我们提供了三种注入方式,分别是set注入,构造方法注入,接口注入。接口注入不作要求,下面介绍前两种方式。

 

1set注入

  采用属性的set方法进行初始化,就成为set注入。

    1)给普通字符类型赋值。

 

[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. public class User{  
  2.    privateString username;  
  3.    
  4.    publicString getUsername() {  
  5.        returnusername;  
  6.    }  
  7.    publicvoid setUsername(String username) {  
  8.       this.username= username;  
  9.    }  
  10. }  

 

 

   我们只需要提供属性的set方法,然后去属性文件中去配置好让框架能够找到applicationContext.xml文件beans标签。标签beans中添加bean标签, 指定idclass值,id值不做要求,class值为对象所在的完整路径。bean标签再添加property 标签,要求,name值与User类中对应的属性名称一致。value值就是我们要给User类中的username属性赋的值。

 

[html] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. <bean id="userAction"class="com.lsz.spring.action.User" >  
  2. <span style="white-space:pre">  </span><property name="username" value="admin"></property>  
  3. </bean>  

 

 

   2)给对象赋值

 同样提供对象的set方法

 

[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. public class User{  
  2.      private UserService userservice;  
  3.      public UserServicegetUserservice() {  
  4.           returnuser;  
  5.      }  
  6.      public void setUserservice(UserService userservice){  
  7.          this.userservice= userservice;  
  8.      }  
  9. }  

 

 

   配置文件中要增加UserServicebean标签声明及User对象对UserService引用。

 

[html] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. <!--对象的声明-->  
  2. <bean id="userService" class="com.lsz.spring.service.UserService"></bean>  
  3.    
  4. <bean id="userAction"class="com.lsz.spring.action.User" >  
  5.    <property name="userservice" ref="userService"></property>  
  6. </bean>  

 

  这样配置,框架就会将UserService对象注入到User类中。

 

  3)给list集合赋值

 同样提供set方法

 

[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. public class User{  
  2.     privateList<String> username;  
  3.     publicList<String> getUsername() {  
  4.         returnusername;  
  5.     }  
  6.     publicvoid setUsername(List<String> username) {  
  7.         this.username= username;  
  8.     }  
  9. }  

 

 

 

[html] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. <bean id="userAction"class="com.lsz.spring.action.User" >  
  2.      <propertynamepropertyname="username">  
  3.            <list>  
  4.                <value>zhang,san</value>  
  5.                <value>lisi</value>  
  6.                <value>wangwu</value>                                  
  7.                </list>  
  8.     </property>  
  9. </bean>  



 

 

  4)给属性文件中的字段赋值

 

[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. public class User{  
  2.     privateProperties props ;  
  3.     publicProperties getProps() {  
  4.         returnprops;  
  5.     }  
  6.     publicvoid setProps(Properties props) {  
  7.         this.props= props;  
  8.     }  
  9. }  

 

[html] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. <bean>  
  2.     <propertynamepropertyname="props">  
  3.         <props>  
  4.            <propkeypropkey="url">jdbc:oracle:thin:@localhost:orl</prop>  
  5.            <propkeypropkey="driverName">oracle.jdbc.driver.OracleDriver</prop>  
  6.            <propkeypropkey="username">scott</prop>  
  7.            <propkeypropkey="password">tiger</prop>  
  8.         </props>  
  9.     </property>  
  10. </bean>  



 

<prop>标签中的key值是.properties属性文件中的名称

 

注意:

  无论给什么赋值,配置文件中<property>标签的name属性值一定是和对象中名称一致。

 

 

2构造方法注入

   1)构造方法一个参数

 

[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. public class User{  
  2.     privateString usercode;  
  3.     publicUser(String usercode) {  
  4.         this.usercode=usercode;  
  5.     }  
  6. }  

 

 

 

[html] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. <bean id="userAction"class="com.lsz.spring.action.User">                          
  2.     <constructor-argvalueconstructor-argvalue="admin"></constructor-arg>                          
  3. </bean>  



 

   2)构造函数有两个参数时

  当参数为非字符串类型时,在配置文件中需要制定类型,如果不指定类型一律按照字符串类型赋值。

  当参数类型不一致时,框架是按照字符串的类型进行查找的,因此需要在配置文件中制定是参数的位置

 

 

[html] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. <constructor-argvalueconstructor-argvalue="admin"index="0"></constructor-arg>                  
  2. <constructor-argvalueconstructor-argvalue="23" type="int"index="1"></constructor-arg>  
  3.    

 

 

  这样制定,就是构造函数中,第一个参数为string类型,第二个参数为int类型

 

 

控制反转与依赖注入  

控制反转(IoC/Inverse Of Control):   调用者不再创建被调用者的实例,由spring框架实现(容器创建)所以称为控制反转。

依赖注入(DI/Dependence injection) :   容器创建好实例后再注入调用者称为依赖注入。

当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例,。如果创建被调用者实例的工作不再由调用者来完成,而是由外部容器完成,因此称为控制反转; 创建被调用者 实例的工作通常由外部容器来完成,然后注入调用者,因此也称为依赖注入。

下面一个小实例:

定义一个接口 

public interface Person {
               void sayHello(); 
        } 

第一个实现类:

public class Chinese implements Person {
             public void sayHello() {
                    System.out.println("您好 !");
             }
      }

第二个实现类: 

public class American implements Person {

     public void sayHello() {
                 System.out.println("How do you do .");
            }

}

 

注意这个类与传统设计有什么区别:该类调用Person子类的方法,传统设计在本类中创造实例,而在此类里并没有创造实例

public class User {
           Person p;
            public Person getP() {
                return p;
           }
            //使用setter注入
          public void setP(Person p) {
              this.p = p;
          } 
          

//调用person子类重写的sayHello方法,这里的p并没有实例化

    public void function(){
              p.sayHello();
            }

}

 

外部‘容器’

public class Container{

    public static User getBean(){   

        Person p=new Chinese();

        User user = new User();

         //由容器‘注入’实例

        user.setP(p);

        return user;

    }

}

 

测试类:

public class Test{

    public static void main(String[] args){

           User user = Container.getBean();

           user.function();

    }

}

//后台输出‘您好’

通过这个例子应该看懂了控制反转,和依赖注入了吧,这个是不是与传统设计相‘反了’。:-D

 

 

相关知识

      依赖和耦合(Dependency and Coupling)

         如果模块A调用模块B提供的方法,或访问模块B中的某些数据成员(当然,在面向对象开发中一般不提倡这样做),我们就认为模块A依赖于模块B,模块A和模块B之间发生了耦合。

  那么,依赖对于我们来说究竟是好事还是坏事呢?

  由于人类的理解力有限,大多数人难以理解和把握过于复杂的系统。把软件系统划分成多个模块,可以有效控制模块的复杂度,使每个模块都易于理解和维护。但在这种情况下,模块之间就必须以某种方式交换信息,也就是必然要发生某种耦合关系。如果某个模块和其它模块没有任何关联(哪怕只是潜在的或隐含的依赖关系),我们就几乎可以断定,该模块不属于此软件系统,应该从系统中剔除。如果所有模块之间都没有任何耦合关系,其结果必然是:整个软件不过是多个互不相干的系统的简单堆积,对每个系统而言,所有功能还是要在一个模块中实现,这等于没有做任何模块的分解。

 

  因此,模块之间必定会有这样或那样的依赖关系,永远不要幻想消除所有依赖。但是,过强的耦合关系(如一个模块的变化会造成一个或多个其他模块也同时发生变化的依赖关系)会对软件系统的质量造成很大的危害。特别是当需求发生变化时,代码的维护成本将非常高。所以,我们必须想尽办法来控制和消解不必要的耦合,特别是那种会导致其它模块发生不可控变化的依赖关系。依赖倒置、控制反转、依赖注入等原则就是人们在和依赖关系进行艰苦卓绝的斗争过程中不断产生和发展起来的。

分享到:
评论

相关推荐

    Spring依赖注入——java项目中使用spring注解方式进行注入.rar

    Spring依赖注入——java项目中使用spring注解方式进行注入.rar

    Spring从入门到入土——依赖注入(DI)

    DIDependency Injection概念注入方式...Spring从入门到入土——依赖注入(DI) Spring从入门到入土——Bean的作用域 Dependency Injection 概念 依赖注入(DI) 依赖:指Bean对象的创建依赖于容器。Bean对象的依赖资

    Spring——IOC(控制反转)与DI(依赖注入).docx

    IOC与DI的理解及使用 控制反转IOC(Inversion of Control)是一种设计思想,DI(依赖注入)是实现IOC的一种方法 。... 在Spring中实现控制反转的是IOC容器 ,其 实现方法是依赖注入 (Dependency Injection,DI)

    Java课件-14-Spring-IoC-Course

    Spring容器简介——依赖注入

    javaSpring

    Spring核心机制——依赖注入,Spring与Struts 2整合应用

    Spring——DI和通过注解实现IOC和DI

    DI(依赖注入) – 问题的提出: 之前所说的IOC,其中没有提到,如果当spring保存的类中有其他属性需要赋值的话怎么办(其实可以用工厂模式来完成),所以今天我们就来解决这个问题。 – DI的概念: 当spring容器...

    初识Spring——Spring核心容器

    IOC-InversionofControl,译为控制反转,是一种遵循依赖倒置原则的代码设计思想。所谓依赖倒置,就是把原本的高层建筑依赖底层建筑“倒置”过来,变成底层建筑依赖高层...DI-DependencyInjection,译为依赖注入,实际上

    Spring从入门到入土——Bean的作用域

    Spring从入门到入土——依赖注入(DI) Spring从入门到入土——Bean的作用域 Bean的作用域 ​ 在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。简单地讲,bean就是由IoC容器初始...

    spring培训-笔记

    控制反转(IoC)/依赖注入(DI) 11 什么是控制反转/依赖注入? 11 依赖注入的三种实现形式 12 BeanFactory 14 BeanFactory管理Bean(组件)的生命周期 15 Bean的定义 16 Bean的之前初始化 19 Bean的准备就绪...

    Spring教程  主要内容:介绍Spring的历史,Spring的概论和它的体系结构,重点阐述它在J2EE中扮演的角色。

    控制反转(IoC)/依赖注入(DI) 11 什么是控制反转/依赖注入? 11 依赖注入的三种实现形式 12 BeanFactory 14 BeanFactory管理Bean(组件)的生命周期 15 Bean的定义 16 Bean的之前初始化 19 Bean的准备就绪(Ready...

    golang依赖注入——wire

    最近在做golang的框架,发现golang同样需要类似java中spring一样的ioc依赖注入框架。 如果项目规模小的情况下,是否有依赖注入框架问题不大,但是当项目变大之后,有一个合适的依赖注入框架是十分必要的。 通过调研...

    Spring技术内幕学习笔记.docx

    《Spring技术内幕》学习笔记1——IoC容器体系结构 ...《Spring技术内幕》学习笔记5——IoC容器的依赖注入 《Spring技术内幕》学习笔记6——IoC容器的高级特性 《Spring技术内幕》学习笔记7——AOP基础

    《Java EE应用开发基础》第五章课件(PDF版)

    济南大学《Java EE应用开发基础》课程课件(PDF版...5.2 Spring核心机制——依赖注入 5.3 Spring核心接口及基本配置 5.4 Spring AOP 5.5 Spring事务支持 5.6 Spring与Struts 2整合应用 5.7 Spring与Hibernate整合应用

    什么是依赖注入——本文作者的思想太经典了

    作者形象的讲解了Spring的以来机制,对于初学者会有很大的帮助!推荐去看看!

    跟我学spring3(8-13)

    【第十二章】零配置 之 12.2 注解实现Bean依赖注入 ——跟我学spring3 【第十二章】零配置 之 12.3 注解实现Bean定义 ——跟我学spring3 【第十二章】零配置 之 12.4 基于Java类定义Bean配置元数据 ——跟我学spring...

    跟我学spring3(8-13).pdf

    11.2 实现通用层 11.3 实现积分商城层 12.1 概述 12.2 注解实现Bean依赖注入 12.3 注解实现Bean定义 12.4 基于Java类定义Bean配置元数据 12.5 综合示例-积分商城 13.1 概述 13.2 单元测试 集成测试 ——跟我学spring3

    SSH整合实例

    Struts2、Spring与Hibernate整合应用 ————学生成绩管理系统 要求: (1) 整合Struts2、Spring和...掌握Spring的开发步骤,理解依赖注入、AOP、事务管理等 掌握Struts2、Spring和Hibernate框架的整合 掌握分页技术

    swing界面设计之JTree

    (一) Spring 开发 Swing GUI 简介——依赖注入和富客户机 5 关于本教程 5 前提条件 6 Spring 和依赖注入概述 7 什么是 Spring 框架? 7 什么是依赖注入? 7 环境设置 7 选择编译环境 7 设置 Ant 8 通过 Ant 自动下载...

    Spring.3.x企业应用开发实战(完整版).part2

    4.3 依赖注入 4.3.1 属性注入 4.3.2 构造函数注入 4.3.3 工厂方法注入 4.3.4 选择注入方式的考量 4.4 注入参数详解 4.4.1 字面值 4.4.2 引用其他Bean 4.4.3 内部Bean 4.4.4 null值 4.4.5 级联属性 4.4.6 集合类型...

Global site tag (gtag.js) - Google Analytics