`
古镇灵狐
  • 浏览: 3948 次
  • 性别: 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_依赖注入_面向接口编程_不同加载方式

    本项目以"Spring_依赖注入_面向接口编程_不同加载方式"为主题,旨在帮助初学者理解Spring的核心特性——依赖注入(Dependency Injection,简称DI),以及如何通过面向接口编程来提高代码的可维护性和可扩展性。...

    spring学习:依赖注入的几种方式讨论

    Spring Boot引入了一种更智能的依赖注入方式——自动配置。自动配置是通过`@EnableAutoConfiguration`注解启动的,它根据项目中的类路径和特定条件自动配置Bean。例如,如果类路径下存在`MongoClient`的jar,Spring ...

    Spring的依赖注入,与前置通知的实例

    在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它允许对象之间的耦合性降低,使得代码更易于测试和维护。依赖注入的核心思想是将一个对象依赖的其他对象通过构造函数、setter方法...

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

    在Java开发领域,Spring框架是应用最广泛的轻量级框架之一,它提供了强大的依赖注入(Dependency Injection,简称DI)功能,极大地简化了组件之间的耦合。本知识点将深入探讨Spring框架如何通过注解方式实现依赖注入...

    Spring————面试题库

    使用Spring框架能够为开发者带来许多好处,例如通过依赖注入(Dependency Injection, DI)方法,能够清晰地管理对象间的依赖关系,相比于EJB容器,Spring的IoC容器更为轻量级,更适合在有限的内存和CPU资源下进行...

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

    Spring框架中的IOC(控制反转)和DI(依赖注入)是两种关键的设计模式,它们极大地提升了软件的可维护性和可扩展性。控制反转是一种设计思想,它改变了传统的对象创建方式,将对象的创建和管理权从应用程序自身转移...

    Spring 核心机制(依赖注入)

    ### Spring核心机制——依赖注入详解 #### 一、引言 Spring框架作为一款优秀的轻量级Java应用开发框架,其核心理念之一就是依赖注入(Dependency Injection, DI)。依赖注入不仅能够帮助开发者降低代码间的耦合度...

    ProSpring——Spring专业开发指南

    《ProSpring——Spring专业开发指南》是一本深入探讨Spring框架的专业书籍,旨在帮助开发者全面理解和掌握Spring的核心概念、功能及最佳实践。通过阅读本书,你可以深入理解Spring如何为Java应用程序提供强大的依赖...

    Spring 简单案例(依赖注入)_02

    标题 "Spring 简单案例(依赖注入)_02" 暗示我们将探讨的是Spring框架中的一个重要概念——依赖注入(Dependency Injection,简称DI)。在Spring框架中,依赖注入是一种设计模式,它允许我们解耦组件,使得代码更加...

    spring——第十四节素材.rar

    标题中的“spring——第十四节素材.rar”表明这是一个关于Spring框架的教程材料,可能是课程的第14节内容。Spring是Java开发中最广泛使用的轻量级框架,它提供了丰富的功能来简化企业级应用的开发,包括依赖注入、...

    Spring依赖注入使用构造设注入demo

    本篇将详细讲解如何使用构造器注入作为Spring依赖注入的一种方式,并通过一个完整的可运行示例——"SpringIOCTest2"来加深理解。 首先,理解依赖注入的概念。依赖注入允许我们不在类内部创建对象,而是通过外部源...

    Spring与IoC系列三:基于XML的依赖注入测试程序di.rar

    在本教程中,我们将深入探讨Spring框架中的一个重要概念——依赖注入(Dependency Injection,简称DI),以及如何通过XML配置实现这一机制。Spring是一个流行的Java企业级应用程序框架,它提供了丰富的功能,包括...

    Spring-注入依赖

    本文将深入探讨Spring框架中的核心特性——依赖注入(Dependency Injection,简称DI),以及如何在项目中实现和利用这一特性。 依赖注入是Spring的核心概念之一,它的主要目标是降低组件之间的耦合性,提高代码的可...

    Spring——jar包详解

    在Spring框架中,jar包包含了所有必要的类和库,使得开发者可以利用Spring的功能进行开发,如依赖注入、AOP(面向切面编程)、数据访问、事务管理等。 Spring框架主要由以下几个核心模块组成: 1. **Spring Core**...

    依赖注入那些事儿

    - **Spring.NET**:Spring.NET是.NET平台上的Spring框架,它提供了一整套企业级开发所需的工具和框架,包括依赖注入支持。 - **Unity**:Unity是一个由Microsoft开发的轻量级IoC Container,支持多种依赖注入模式,...

    Spring简单仿写,实现基本IOC,依赖注入和AOP 未解决循环依赖

    本文将深入探讨Spring框架的核心特性——依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP),以及如何解决循环依赖问题。 首先,依赖注入是Spring框架的核心理念之一,它的...

    spring aop依赖jar包

    - `spring-core.jar`:Spring的核心库,提供了基本的IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)功能,是其他所有模块的基础。 - `spring-context.jar`:提供了上下文容器,扩展...

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

    Spring 提供了一个强大的依赖注入容器,可以自动地将依赖项注入到 Bean 中,从而简化了系统的开发和维护。 依赖注入模式的优点包括: * 松散耦合:依赖注入模式使得组件之间的依赖关系变得松散,提高了系统的灵活...

Global site tag (gtag.js) - Google Analytics