`

Spring的注入方式详解

阅读更多
Spring有三个注入方式,type1,type2,type3

type1  接口依赖

type2  setter/getter

type3  构造方法



type2,type3较用常用

首先来看一下type2




type2 setter/getter(引用注入)


例如,存在一个User类和Home类



user类里一个userName;一个Home对象的属性.

public class User { 
 
       private String userName;
 
    private Home myHome;
 
       public Home getMyHome() { 
 
              return myHome;
 
       }
 
       public void setMyHome(Home myHome) { 
 
              this.myHome = myHome;
 
       }
 
       public String getUserName() { 
 
              return userName;
 
       }
 
       public void setUserName(String userName) { 
 
              this.userName = userName;
 
       }
 
}
 
public class Home { 
 
       private String homeAddr;
 
       public String getHomeAddr() { 
 
              return homeAddr;
 
       }
 
       public void setHomeAddr(String homeAddr) { 
 
              this.homeAddr = homeAddr;
 
       }
 
}
 
public class TestMain { 
 
    public static void main(String[] args) { 
 
        ApplicationContext context=new FileSystemXmlApplicationContext("test/lyx/applicationContext.xml");
 
        User user1=(User)context.getBean("user");
 
    

        System.out.println(“姓名为: ”+user1.getUserName());
 
        System.out.println(“家庭住址是: ”+user1.getMyHome().getHomeAddr());
 
 
 
    }
 
 
 
}


将两个bean的注入:(applicationContext.xml配置如下)

     
 <bean id="home" class="test.lyx.Home" abstract="false"
 
              singleton="true" lazy-init="default" autowire="default"
 
              dependency-check="default">
 
              <property name="homeAddr">
 
                     <value>大连</value>
 
              </property>
 
       </bean>
 
 
 
       <bean id="user" class="test.lyx.User" abstract="false"
 
              singleton="true" lazy-init="default" autowire="default"
 
              dependency-check="default">
 
              <property name="userName">
 
                     <value>liuyuanxi</value>
 
              </property>
 
              <property name="myHome">
 
              <ref bean="home"/>
 
              </property>
 
       </bean>


这里的user bean,引用了home bean,

运行时会打出 

姓名为:liuyuanxi

家庭住址是:大连

这种方式就是setter/getter方式注入,习惯用JavaBean的人应该很容易理解这种方法,也就是能过<property name="userName">来指定属性. <value>liuyuanxi</value>来指定属性所对应的值.多少个属性就有多少个<property>

这里一个人,和家是两个类,也提到了两个bean之间的引用.也就是user bean给名字赋了值,home bean给地址赋了值.如果在user bean中想引入 home bean中的地址.就用<ref/>不再用<values>





type3 构造方法注入


这里我们在User里加入一个构造器

public User(Home myHome){ 
 
this.myHome=myHome;
 
}


然后 把配置文件改一下:autowire=constructor;


       <bean id="home" class="test.lyx.Home" abstract="false"
 
              singleton="true" lazy-init="default" autowire="default"
 
              dependency-check="default">
 
              <property name="homeAddr">
 
                     <value>大连</value>
 
              </property>
 
       </bean>
 
 
 
       <bean id="user" class="test.lyx.User" abstract="false"
 
              singleton="true" lazy-init="default" autowire=" constructor "
 
              dependency-check="default">
 
              <property name="userName">
 
                     <value>liuyuanxi</value>
 
              </property>
 
              <property name="myHome">
 
              <ref bean="home"/>
 
              </property>
 
       </bean>


运行时会打出 

姓名为:liuyuanxi

家庭住址是:大连

这种方式就是构造器注入



我们再来看看spring的绑定

也就是通过bean属性autowire来设置

1.       通过bean属性autowire="byType"的设置可以使用bean在运行时候根据去寻找同类型的已定义属性,如果找不到则处于未绑定状态.(已定义好指在applicationContext.xml中初始化)这里我们把配置文件的 user bean的autowire改成autowire="byType",注意一定要把User的构造器去掉,要不然先找构造器,会出错.这里的home bean是属于,test.lyx.Home类型的,而user bean里有两个属性一个属性已经初始化,而另一个属性Home,就会自动找到.

applicationContext.xml配置如下:

  
    <bean id="home" class="test.lyx.Home" abstract="false"
 
              singleton="true" lazy-init="default" autowire="default"
 
              dependency-check="default">
 
              <property name="homeAddr">
 
                     <value>大连</value>
 
              </property>
 
       </bean>
 
 
 
       <bean id="user" class="test.lyx.User" abstract="false"
 
              singleton="true" lazy-init="default" autowire=" byType "
 
              dependency-check="default">
 
              <property name="userName">
 
                     <value>liuyuanxi</value>
 
              </property>
 
              <property name="myHome">
 
              <ref bean="home"/>
 
              </property>
 
       </bean>


运行时会打出 

姓名为:liuyuanxi

家庭住址是:大连

这种方式就是构造器注入



但这样的寻找方式有一个弱点,

假如再注入一个Home bean,叫home1,运行时就会找到两个bean,出错.

     
 <bean id="home1" class="test.lyx.Home" abstract="false"
 
              singleton="true" lazy-init="default" autowire="default"
 
              dependency-check="default">
 
              <property name="homeAddr">
 
                     <value>beijing</value>
 
              </property>
 
       </bean>

如果我们想解决这种问题也很简单,我们可以把autowire改为,autowire="byName"方式来寻找.

但是这里一定要注意:Home bean的id名,一定要和属性名字一样.这里应该改成,id="myHome"

     
 <bean id="home1" class="test.lyx.Home" abstract="false"
 
              singleton="true" lazy-init="default" autowire="default"
 
              dependency-check="default">
 
              <property name="homeAddr">
 
                     <value>dalian</value>
 
              </property>
 
       </bean>
 
       <bean id="myHome" class="test.lyx.Home" abstract="false"
 
              singleton="true" lazy-init="default" autowire="default"
 
              dependency-check="default">
 
              <property name="homeAddr">
 
                     <value>北京</value>
 
              </property>
 
       </bean>

这样的话

运行时会打出 

姓名为:liuyuanxi

家庭住址是:北京

而不在是大连了,这种寻找方式就是byName,也就是按属性的名字进行查询.注意:id一定要属性的名字一样.



2.我们来比较一个byname和 bytype这两种方式.

byname要比bytype精确些,因为id,是不能重名的.

而且假如存在一这样一种情况,两个user bean,分别为user1,user2,那么user1,user2都可以,打出北京.重用性很好.

到这可能有人会想到.user1,和user2调用的是同一个Home吗.你可以把他们的hashcode();打出来,你会发现地址是一样的,也就是说,是同一个bean.这里是因为singleton="true"的原因,如果你把singleton改成了"false"那就不是一个对象了.

3.如果把autowire=” constructor”也就是构造器注入一定要注意了,他是以byType进行查找,也就是说,Home bean,是不能出现两次,否则就会出错了.

4.如果autowire设置成为autodetect,他会一直找,直到找到一个合适的为止.constructor,bytype,byname的顺序去找.这种方式是不推荐使用的.因为你很难判断出执行的是那个.
分享到:
评论

相关推荐

    spring依赖注入底层详解

    在Spring中,依赖注入可以通过构造器注入、设值注入和接口注入三种方式实现。 1. 构造器注入:通过在类的构造函数中传递依赖对象来完成注入。这种方式在创建对象时就确保了所有依赖都已就绪,适合于对象的依赖关系...

    (转)Spring 3.0 注解注入详解

    Spring 3.0 是一个里程碑式的版本,引入了大量的新特性,其中注解注入是其核心改进之一。注解注入使得代码更加简洁,减少了XML配置,提高了开发效率。在这个专题里,我们将深入探讨Spring 3.0中的注解注入机制。 ...

    spring注解注入示例详解.pdf

    Spring框架是Java企业级开发中非常重要的一个框架,它通过依赖注入(DI)的方式极大地简化了企业级应用的开发。Spring提供了多种注解来帮助开发者实现依赖注入,其中包括@Autowired、@Qualifier、@Resource以及@...

    spring jar 包详解

    ### Spring Jar 包详解 #### 一、Spring Jar 包概览 Spring 是一个开源的 Java 开发框架,主要用于简化企业级应用的开发工作。它通过提供一系列的基础框架,使得开发者能够更容易地处理复杂的业务逻辑,并且提高了...

    spring配置文件详解

    这些Bean对象之间可以通过依赖注入的方式进行关联和配置。 在给定的配置文件中,我们可以看到以下几个重要的配置部分: 首先是数据源的配置,我们使用Apache Commons DBCP提供的BasicDataSource来配置数据源。在这...

    spring3注解详解

    1. `@Autowired`:这个注解用于自动装配Bean,Spring会尝试根据类型或者通过属性名来找到合适的依赖注入。如果存在多个候选Bean,可以通过`@Qualifier`进一步指定。 2. `@Qualifier`:与`@Autowired`配合使用,当有...

    spring注解注入示例详解-(三)

    在Spring框架中,注解注入是一种非常重要的依赖注入方式,它允许开发者在不编写XML配置文件的情况下,通过在类的属性上添加特定的注解来完成对象的实例化和依赖关系的绑定。本文将深入探讨Spring注解注入的原理、...

    spring3.0依赖注入详解

    ### Spring 3.0依赖注入详解 #### 引言 Spring框架自2.0版本起,不断优化其依赖注入机制,引入了一系列注解以简化Java应用程序的开发过程。特别是Spring 3.0版本,对依赖注入(DI)进行了深度拓展,引入了基于...

    spring所有配置文件详解

    ### Spring配置文件详解 #### 一、引言 在Java Web开发领域,Spring框架因其强大的功能和灵活性而受到广泛欢迎。对于初学者来说,理解Spring的配置方式是至关重要的第一步。本文将详细介绍Spring中常见的配置文件...

    SpringIoc注入

    **Spring Ioc 注入详解** Spring 框架的核心特性之一就是依赖注入(Dependency Injection,简称DI),也常被称为控制反转(Inversion of Control,IoC)。它是一种设计模式,可以减少代码之间的耦合,提高系统的可...

    Spring Bean常用依赖注入方式详解

    Spring Bean依赖注入方式详解 Spring Bean依赖注入是Spring框架中的一种重要机制,它允许开发者将Bean对象的依赖项指定为特定的对象,从而实现松耦合和高内聚的设计理念。在Spring中,依赖注入主要有三种方式:构造...

    整合struts+hibernate+spring应用开发详解 part1

    "整合struts+hibernate+spring应用开发详解"是一个系列教程,旨在帮助开发者深入理解这三者如何协同工作。 首先,Struts是一个MVC(Model-View-Controller)框架,它主要处理HTTP请求,负责控制应用程序的流程。在...

    spring 所有功能详解

    ### Spring七大功能详解 #### 一、核心容器(Spring Core) **核心容器**提供了Spring框架的基础功能,通过Bean的方式组织和管理Java应用中的各种组件及其之间的关系。在Spring框架中,Bean Factory扮演着核心角色...

    spring注解使用详解

    【Spring注解使用详解】 Spring框架自2.5版本开始,引入了注解配置,使得开发者可以在不依赖XML配置文件的情况下实现Bean的定义和依赖注入。注解配置因其简洁、直观的特点,逐渐成为主流的配置方式。在本文中,我们...

    spring框架技术详解及使用指导(电子书PDF)

    在阅读“spring框架技术详解及使用指导”时,你可能会学到如何配置Spring IoC容器,如何使用注解进行依赖注入,如何编写AOP切面,以及如何利用Spring MVC构建RESTful Web服务。此外,书中可能还会涵盖Spring Boot的...

    SPRING2.0开发详解

    ### SPRING2.0开发详解 #### 一、Spring框架简介 Spring框架是一个开源的Java平台,用于构建企业级应用程序和服务。它最初由Rod Johnson在2004年创建,并随着时间的发展不断壮大和完善。Spring 2.0版本是Spring...

Global site tag (gtag.js) - Google Analytics