`
胡小米
  • 浏览: 78624 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring2.5 IoC之bean的四种注入方式(转)

阅读更多
1、新建一个java工程名叫DI(依赖注入的意思),加入commons-loggin.jar和spring.jar。注意下面的代码含义见其注释,这里就不再作解释。
2、整个工程测试完后spring配置文件beans.xml文件的代码如下:
Xml代码 
<?xml version="1.0" encoding="gbk"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 
   <!--构造器注入简单类型的参数--> 
   <bean name="cipb" class="com.iwtxokhtd.constructor.injection.bean.ConstructorInjectionPropertyBean"> 
      <!--根据类型顺序来匹配,要指定type属性--> 
      <constructor-arg type="int" value="25"/> 
      <!--必须是java.lang.String,不能是String,否则会报异常--> 
      <constructor-arg type="java.lang.String" value="iwtxokhtd"/> 
   </bean> 
   <!--用索引可以避免多个同类型的情况,从0开始--> 
    <bean name="indexProsBean" class="com.iwtxokhtd.constructor.injection.bean.ConstructorInjectionPropertyBean"> 
      <constructor-arg index="0" value="20"/> 
      <constructor-arg index="1" value="tujiyue"/> 
   </bean> 
   
   <!--构造器注入对象--> 
   <bean name="ciob" class="com.iwtxokhtd.constructor.injection.bean.ConstructorInjectionObjectBean"> 
     <constructor-arg> 
        <ref bean="depentedBean"/> 
     </constructor-arg> 
     <constructor-arg type="java.lang.String" value="增加一个简单类型"/> 
   </bean> 
    <!--被依赖的bean,其属性也采用构造器注入--> 
   <bean name="depentedBean" class="com.iwtxokhtd.constructor.injection.bean.DepentedObjectConstructorBean"> 
     <!--以下两个属性都是java.lang.String最好用index--> 
     <constructor-arg type="java.lang.String" value="属性一"/> 
     <!--下面这种写法与上相同--> 
     <constructor-arg type="java.lang.String"> 
        <value>属性二</value> 
     </constructor-arg> 
   </bean> 
   <!--setter注入简单类型属性--> 
   <bean name="sipb" class="com.iwtxokhtd.setter.injection.bean.SetterInjectionPropertyBean"> 
     <property name="id" value="1"/> 
     <!--这种写法与上一样--> 
     <property name="name"> 
        <value>iwtxokhtd</value> 
     </property> 
   </bean> 
   <!--setter注入对象类型--> 
   <bean name="siob" class="com.iwtxokhtd.setter.injection.bean.SetterInjectionObjectBean"> 
    <!--那个简单的类型--> 
    <property name="year" value="60"/> 
    <!--对象类型--> 
    <property name="dosb" ref="depentSetterBean"/> 
    <!--等价于上面的配置方式--> 
    <!-- 
    <property name="dosb"> 
     <ref bean="depentSetterBean"/> 
    </property> 
    --> 
   </bean> 
   <!--被信赖setter注入的对象--> 
   <bean name="depentSetterBean" class="com.iwtxokhtd.setter.injection.bean.DepentedObjectSetterBean"> 
    <!--两个简单类型的属性--> 
    <property name="propertyOne" value="setter属性值一"/> 
    <property name="propertyTwo" value="setter属性值二"/> 
   </bean> 
   <!--静态工厂方法参数注入对象--> 
   <bean name="sfmob" class="com.iwtxokhtd.staticfactory.injection.bean.StaticFactoryMethodObjectBean" 
    factory-method="createInstance"> 
     <!--语法规则依然是使用构造器注入方式--> 
     <constructor-arg ref="dfmob"/> 
     <!--还有一个简单的类型--> 
     <constructor-arg type="int" value="100"/> 
     <!--等价形式--> 
     <!-- 
     <constructor-arg> 
      <ref bean="dfmob"/> 
     </constructor-arg> 
     --> 
   </bean> 
   <!--工厂方法依赖注入的对象--> 
   <bean name="dfmob" class="com.iwtxokhtd.staticfactory.injection.bean.DepentedFactoryMethodObjectBean"> 
     <!--里面有一个简单类型的setter注入--> 
     <property name="one" value="一个简单的类型"/> 
   </bean> 
   <!--InstanceFactoryMethodObjectBean一定要有个默认的构造器--> 
    <bean name="ifmob"  class="com.iwtxokhtd.instancefactory.injection.bean.InstanceFactoryMethodObjectBean"/> 
   <!--实例工厂方法参数注入对象--> 
   <bean name="ifmobtest"  
   factory-bean="ifmob" factory-method="createInstance">      
     <constructor-arg ref="dfmob"/> 
     <constructor-arg type="java.lang.String" value="实例工厂方法注入"/> 
   </bean> 
</beans> 

3、bean的四种注入方式
第一种注入方式:构造器注入
Java代码 
/**
* 构造器注入属性Bean
*/ 
package com.iwtxokhtd.constructor.injection.bean; 
 
/**
* @author Administrator
*
*/ 
public class ConstructorInjectionPropertyBean { 
 
    //简单类型,依赖的构造器属性 
    private int age; 
    private String name; 
    public ConstructorInjectionPropertyBean(int age, String name) { 
        this.age = age; 
        this.name = name; 
    } 
    //提供外部访问 
    public int getAge(){ 
        return age; 
    } 
    public String getName(){ 
        return name; 
    } 
     
     


Java代码 
/**
* 构造器注入对象bean
*/ 
package com.iwtxokhtd.constructor.injection.bean; 
 
/**
* @author Administrator
*
*/ 
public class ConstructorInjectionObjectBean { 
 
    //依赖的对象 
    private DepentedObjectConstructorBean db; 
    //也提供一个简单的类型作测试 
    private String simple; 
     
    //注入到构造器中 
    public ConstructorInjectionObjectBean(DepentedObjectConstructorBean db,String simple) { 
        this.db = db; 
        this.simple=simple; 
    } 
    //提供外部访问 
    public DepentedObjectConstructorBean getDb() { 
        return db; 
    } 
    public String getSimple() { 
        return simple; 
    } 
     
     


Java代码 
/**
* 被信赖的对象bean
*/ 
package com.iwtxokhtd.constructor.injection.bean; 
 
/**
* @author Administrator
*
*/ 
public class DepentedObjectConstructorBean { 
 
    private String paramOne; 
    private String paramTwo; 
    public DepentedObjectConstructorBean(String paramOne, String paramTwo) { 
        this.paramOne = paramOne; 
        this.paramTwo = paramTwo; 
    } 
    //提供外部访问 
    public String getParamOne() { 
        return paramOne; 
    } 
    public String getParamTwo() { 
        return paramTwo; 
    } 
     
     


第二种注入方式:setter注入
Java代码 
/**
* setter注入简单类型属性bean
*/ 
package com.iwtxokhtd.setter.injection.bean; 
 
/**
* @author Administrator
*
*/ 
public class SetterInjectionPropertyBean { 
 
    //依赖的属性1 
    private int id; 
    private String name; 
    public int getId() { 
        return id; 
    } 
    //setter注入 
    public void setId(int id) { 
        this.id = id; 
    } 
    public String getName() { 
        return name; 
    } 
    //setter注入 
    public void setName(String name) { 
        this.name = name; 
    } 


Java代码 
/**
* setter注入对象类型bean
*/ 
package com.iwtxokhtd.setter.injection.bean; 
 
/**
* @author Administrator
*
*/ 
public class SetterInjectionObjectBean { 
 
    //依赖setter注入的对象 
    private DepentedObjectSetterBean dosb; 
    //也提供一个简单的类型 
    private int year; 
 
    public DepentedObjectSetterBean getDosb() { 
        return dosb; 
    } 
 
    public void setDosb(DepentedObjectSetterBean dosb) { 
        this.dosb = dosb; 
    } 
 
    public int getYear() { 
        return year; 
    } 
 
    public void setYear(int year) { 
        this.year = year; 
    } 
     


Java代码 
/**
* 被依赖setter注入的对象bean
*/ 
package com.iwtxokhtd.setter.injection.bean; 
 
/**
* @author Administrator
*
*/ 
public class DepentedObjectSetterBean { 
 
    //提供两个简单的类型,也用setter注入 
    private String propertyOne; 
    private String propertyTwo; 
    public String getPropertyOne() { 
        return propertyOne; 
    } 
    public void setPropertyOne(String propertyOne) { 
        this.propertyOne = propertyOne; 
    } 
    public String getPropertyTwo() { 
        return propertyTwo; 
    } 
    public void setPropertyTwo(String propertyTwo) { 
        this.propertyTwo = propertyTwo; 
    } 
     


第三种注入方式:静态工厂方法参数注入
Java代码 
/**
* 静态工厂方法构造注入参数
*/ 
package com.iwtxokhtd.staticfactory.injection.bean; 
 
/**
* @author Administrator
*
*/ 
public class StaticFactoryMethodObjectBean { 
    //依赖静态工作方法注入的对象 
    private DepentedFactoryMethodObjectBean dsfmob; 
    //提供一个简单类型的属性 
    private int property; 
    //私有的构造器 
    private StaticFactoryMethodObjectBean(DepentedFactoryMethodObjectBean dsfmob,int property){ 
        this.dsfmob=dsfmob; 
        this.property=property; 
    } 
    //静态工厂方法 
    public static StaticFactoryMethodObjectBean createInstance(DepentedFactoryMethodObjectBean dsfmob,int property){ 
        StaticFactoryMethodObjectBean smob=new StaticFactoryMethodObjectBean(dsfmob,property); 
        return smob; 
    } 
    //提供外部访问 
    public DepentedFactoryMethodObjectBean getDsfmob() { 
        return dsfmob; 
    } 
    public int getProperty() { 
        return property; 
    } 


Java代码 
/**
* 被依赖静态工厂方法注入的对象
*/ 
package com.iwtxokhtd.staticfactory.injection.bean; 
 
/**
* @author Administrator
*
*/ 
public class DepentedFactoryMethodObjectBean { 
 
    //提供一个简单的对象类型作为测试用 
    private String one; 
 
    public String getOne() { 
        return one; 
    } 
 
    //用setter注入 
    public void setOne(String one) { 
        this.one = one; 
    } 


第四种注入方式:实例工厂方法参数注入
Java代码 
/**
* 实例工厂方法构造注入对象bean
*/ 
package com.iwtxokhtd.instancefactory.injection.bean; 
 
import com.iwtxokhtd.staticfactory.injection.bean.DepentedFactoryMethodObjectBean; 
 
/**
* @author Administrator
*
*/ 
public class InstanceFactoryMethodObjectBean { 
 
    //依赖的对象 
    private DepentedFactoryMethodObjectBean dfmob; 
    //提供一个简单的类型 
    private String two; 
    //这个默认的空构造器不能少,否则bean会创建失败 
    private InstanceFactoryMethodObjectBean(){ 
         
    } 
    //私有的构造器 
    private InstanceFactoryMethodObjectBean(DepentedFactoryMethodObjectBean dfmob,String two){ 
        this.dfmob=dfmob; 
        this.two=two; 
    } 
    //实例工厂方法 
    public InstanceFactoryMethodObjectBean createInstance(DepentedFactoryMethodObjectBean dfmob,String two){ 
        InstanceFactoryMethodObjectBean ifmob=new InstanceFactoryMethodObjectBean(dfmob,two); 
        return ifmob; 
    } 
    public DepentedFactoryMethodObjectBean getDfmob() { 
        return dfmob; 
    } 
    public String getTwo() { 
        return two; 
    } 


客户端测试:
Java代码 
/**
* 构造器注入测试类
*/ 
package com.iwtxokhtd.constructor.injection.test; 
 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
 
import com.iwtxokhtd.constructor.injection.bean.ConstructorInjectionObjectBean; 
import com.iwtxokhtd.constructor.injection.bean.ConstructorInjectionPropertyBean; 
import com.iwtxokhtd.instancefactory.injection.bean.InstanceFactoryMethodObjectBean; 
import com.iwtxokhtd.setter.injection.bean.SetterInjectionObjectBean; 
import com.iwtxokhtd.setter.injection.bean.SetterInjectionPropertyBean; 
import com.iwtxokhtd.staticfactory.injection.bean.StaticFactoryMethodObjectBean; 
 
/**
* @author Administrator
*
*/ 
public class InjectionTest { 
 
     
    public static void main(String[] args) { 
        ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml"); 
        System.out.println("构造器注入属性,配置时指定type属性"); 
        //取得bean 
        ConstructorInjectionPropertyBean cipb=(ConstructorInjectionPropertyBean)ac.getBean("cipb"); 
        //打印注入的两个属性值 
        System.out.println("构造器注入属性之年龄:"+cipb.getAge()); 
        System.out.println("构造器注入属性之姓名:"+cipb.getName()); 
        //用索引设置属性值的方式 
        System.out.println("构造器注入属性,配置时指定index属性"); 
        cipb=(ConstructorInjectionPropertyBean)ac.getBean("indexProsBean"); 
        //打印注入的两个属性值 
        System.out.println("构造器注入属性换了索引之年龄:"+cipb.getAge()); 
        System.out.println("构造器注入属性换了索引之姓名:"+cipb.getName()); 
        System.out.println("----------------------------------"); 
        System.out.println("构造器注入对象,也加了个简单类型"); 
        ConstructorInjectionObjectBean ciob=(ConstructorInjectionObjectBean)ac.getBean("ciob"); 
        System.out.println("先访问其注入的简单类型"); 
        System.out.println("构造器注入对象之简单类型:"+ciob.getSimple()); 
        System.out.println("再访问其注入的对象类型"); 
        System.out.println("其注入对象的第一个注入的属性值:"+ciob.getDb().getParamOne()); 
        System.out.println("其注入对象的第二个注入的属性值:"+ciob.getDb().getParamTwo()); 
        System.out.println("----------------------------------"); 
        System.out.println("Setter方法注入简单类型属性"); 
        SetterInjectionPropertyBean sipb=(SetterInjectionPropertyBean)ac.getBean("sipb"); 
        System.out.println("setter注入简单类型属性id:"+sipb.getId()); 
        System.out.println("setter注入简单类型属性name:"+sipb.getName()); 
        System.out.println("----------------------------------"); 
        System.out.println("Setter方法注入对象类型,也加了一个简单的属性"); 
        SetterInjectionObjectBean siob=(SetterInjectionObjectBean)ac.getBean("siob"); 
        System.out.println("先访问setter注入的简单类型"); 
        System.out.println("setter注入对象之简单类型:"+siob.getYear()); 
        System.out.println("再访问setter注入的对象类型"); 
        System.out.println("setter注入对象的第一个注入的属性值:"+siob.getDosb().getPropertyOne()); 
        System.out.println("setter注入对象的第二个注入的属性值:"+siob.getDosb().getPropertyTwo()); 
        System.out.println("----------------------------------"); 
        System.out.println("静态工厂方法注入对象类型,也加了一个简单的属性"); 
        StaticFactoryMethodObjectBean sfmob=(StaticFactoryMethodObjectBean)ac.getBean("sfmob"); 
        System.out.println("先访问静态工厂方法注入的简单类型"); 
        System.out.println("静态工厂方法注入对象之简单类型:"+sfmob.getProperty()); 
        System.out.println("再访问静态工厂方法注入的对象类型"); 
        System.out.println("静态工厂方法注入对象所注入的属性值:"+sfmob.getDsfmob().getOne()); 
        System.out.println("----------------------------------"); 
        System.out.println("实例工厂方法注入对象类型,也加了一个简单的属性"); 
        InstanceFactoryMethodObjectBean ifmob=(InstanceFactoryMethodObjectBean)ac.getBean("ifmobtest"); 
        System.out.println("先访问实例工厂方法注入的简单类型"); 
        System.out.println("实例工厂方法注入对象之简单类型:"+ifmob.getTwo()); 
        System.out.println("再访问实例工厂方法注入的对象类型"); 
        System.out.println("实例工厂方法注入对象所注入的属性值:"+ifmob.getDfmob().getOne()); 
    } 
 


测试结果:请对照beans.xml文件来验证结果
构造器注入属性,配置时指定type属性
构造器注入属性之年龄:25
构造器注入属性之姓名:iwtxokhtd
构造器注入属性,配置时指定index属性
构造器注入属性换了索引之年龄:20
构造器注入属性换了索引之姓名:tujiyue
----------------------------------
构造器注入对象,也加了个简单类型
先访问其注入的简单类型
构造器注入对象之简单类型:增加一个简单类型
再访问其注入的对象类型
其注入对象的第一个注入的属性值:属性一
其注入对象的第二个注入的属性值:属性二
----------------------------------
Setter方法注入简单类型属性
setter注入简单类型属性id:1
setter注入简单类型属性name:iwtxokhtd
----------------------------------
Setter方法注入对象类型,也加了一个简单的属性
先访问setter注入的简单类型
setter注入对象之简单类型:60
再访问setter注入的对象类型
setter注入对象的第一个注入的属性值:setter属性值一
setter注入对象的第二个注入的属性值:setter属性值二
----------------------------------
静态工厂方法注入对象类型,也加了一个简单的属性
先访问静态工厂方法注入的简单类型
静态工厂方法注入对象之简单类型:100
再访问静态工厂方法注入的对象类型
静态工厂方法注入对象所注入的属性值:一个简单的类型
----------------------------------
实例工厂方法注入对象类型,也加了一个简单的属性
先访问实例工厂方法注入的简单类型
实例工厂方法注入对象之简单类型:实例工厂方法注入
再访问实例工厂方法注入的对象类型
实例工厂方法注入对象所注入的属性值:一个简单的类型
分享到:
评论

相关推荐

    spring 2.5 IOC 自动扫描,自动注入

    自动注入是指Spring框架能够根据bean的依赖关系,自动地将所需的其他bean注入到目标bean中,无需在代码中使用new操作符创建对象。Spring支持多种注入方式,包括构造器注入、设值注入和接口注入。 在Spring 2.5中,...

    Spring2.5 IOC的简单实现

    在 Spring 2.5 中,有两种主要的配置方式: - **XML 配置**: 这是 Spring 早期版本的主要配置方式,通过 `&lt;bean&gt;` 元素定义组件,并使用 `&lt;property&gt;` 或 `&lt;constructor-arg&gt;` 描述其依赖。 - **注解配置**: Spring...

    精通Spring2.5pdf书籍proSpring2.5

    《精通Spring2.5》是一本深度探讨Spring框架的权威指南,主要针对Spring 2.5版本进行深入解析。Spring是Java企业级应用开发中最受欢迎的框架之一,它以其轻量级、模块化的设计,以及对IoC(Inversion of Control,...

    Spring2.5-中文参考手册chm

    Spring的核心特性之一是依赖注入(Dependency Injection,简称DI),也被称为控制反转(Inversion of Control,IoC)。DI允许开发者声明他们所需的依赖关系,而无需手动创建对象或管理这些依赖关系。通过配置文件或...

    spring 2.5框架图

    在Spring 2.5中,对Bean的元数据支持更丰富,包括属性、构造器、工厂方法等的注入方式,同时增强了对JSR-250注解的支持,如`@PostConstruct`和`@PreDestroy`。 4. **Web包**:Spring 2.5的Web模块提供了一个全面的...

    Spring2.5-中文参考手册chm.zip

    这个"Spring2.5-中文参考手册chm.zip"文件包含了关于Spring 2.5版本的详细中文指南,对于学习和理解Spring框架具有很高的价值。 Spring框架的核心特性包括依赖注入(Dependency Injection,DI)、面向切面编程...

    struts2.1+spring2.5+hibernate3.3整合之第一步(spring2.5+hibernate3.3)

    Spring2.5是全面的企业级应用框架,它不仅包含IoC(Inversion of Control,控制反转)容器,用于管理对象的生命周期和依赖关系,还提供了AOP(Aspect-Oriented Programming,面向切面编程)功能,实现了对横切关注点...

    spring2.5常用包

    1. **IoC(Inversion of Control)容器**:Spring 的核心特性是依赖注入(Dependency Injection,DI),通过 IoC 容器来管理对象的生命周期和对象之间的依赖关系。IoC 容器通过 XML 配置文件或注解(如 @Autowired)...

    Spring2.5-Reference_zh_CN.txt

    在Spring2.5中,IoC容器支持通过XML配置文件或注解的方式定义和管理Bean之间的依赖关系。 #### 三、Bean定义与管理 - **Bean定义**:Spring框架中的Bean是应用程序的基本组成部分,它们通常代表业务实体或服务组件...

    spring2.5教程(传智)

    3. **依赖注入(DI)**:依赖注入是IoC的一种实现方式,它允许容器在运行时动态地将依赖对象注入到需要它们的组件中。可以通过构造函数或setter方法实现注入,从而实现组件间的解耦。 4. **Spring管理Bean的原理**...

    Spring2.5实例

    本实例是针对Spring 2.5与Hibernate集成的实战演示,旨在展示如何利用Spring的依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IoC)容器来管理Bean,并通过Spring的面向切面编程...

    spring2.5 中文参考手册

    在2.5版本中,支持XML和注解两种方式来定义Bean及其属性。 3. **AOP(Aspect-Oriented Programming,面向切面编程)**:Spring的AOP模块允许开发者定义切面,将横切关注点(如日志、事务管理)与业务逻辑分离。切面...

    关于spring boot中几种注入方法的一些个人看法

    在 Spring Boot 中,注入是一种非常重要的机制,用于将 bean 对象注入到其他 bean 对象中,以便实现松耦合和高内聚的设计目标。下面我们将对 Spring Boot 中的几种注入方法进行详细的介绍和分析。 1. @Autowired @...

    cxf+Spring2.5

    【标题】"cxf+Spring2.5" 指的是使用Apache CXF框架与Spring 2.5版本进行集成的示例项目。Apache CXF是一个开源服务框架,它允许开发人员创建和消费Web服务,而Spring框架则是一个广泛使用的Java企业级应用的IOC...

    Springioc注入Demo

    在Spring IOC中,主要的注入方式有以下几种: 1. **构造器注入**:通过构造函数传递依赖对象,Spring容器会根据构造函数的参数类型创建并注入相应的对象。这种方式确保对象在创建时就具备所有依赖,增强了对象的...

    Spring2.5视频教程_编码剖析Spring管理Bean的原理

    《Spring2.5视频教程:编码剖析Spring管理Bean的原理》是由知名教育机构黑马程序员的讲师黎活明主讲的一套教程,旨在深入解析Spring框架2.5版本中Bean的管理机制。本教程通过实际编码演示,帮助学习者理解Spring如何...

    spring2.5相关包

    1. **依赖注入增强**:在 Spring 2.5 中,依赖注入通过使用 @Autowired 注解得到了加强。这个注解允许开发者自动装配 Bean 的依赖,而无需编写 XML 配置。此外,@Qualifier 注解可以用来指定具体实现的 Bean,当有多...

    prospring2.5源码

    在ProSpring 2.5中,我们可以看到Spring对于Bean的管理方式,包括Bean的定义、初始化、装配和销毁等过程。源码中展示了如何通过XML配置文件或注解来声明Bean,以及Spring如何解析这些配置,创建Bean实例并管理其生命...

    axis2+spring2.5整合(webservice)

    将Axis2与Spring2.5整合的主要好处在于,可以利用Spring的IoC(Inversion of Control,控制反转)和AOP特性来管理和控制Web服务。这使得Web服务的配置和管理更加简便,同时也便于测试和维护。以下是一些整合的关键...

    Spring之Spring2.5集成Struts2.2

    标题“Spring之Spring2.5集成Struts2.2”涉及到的是在Web开发中整合两个非常流行的开源框架——Spring和Struts2的过程。这个过程旨在利用Spring的强大IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented ...

Global site tag (gtag.js) - Google Analytics