代码改变世界

什么是依赖注入

2011-12-05 09:57  jinze  阅读(3521)  评论(11编辑  收藏  举报

    最近学习Spring IOC,花了几天时间才理解其中的含义,所谓Ioc,被称作“控制反转“,也叫”依赖注入“(本节内容的核心),前一个名称的含义我不清楚,后一个名称的含义也是刚刚才理解,它的含义是:

“所谓依赖注入,是依赖配置文件将属性注入Bean

我的这个解释该如何理解呢?传统java开发,属性是整个java代码的一部分,比如:

Public class People{

         Private String Name=null;

         Public String getName(){

                  

}

}

假如其他类要使用这个Bean作为数据结构,按照传统的方式,我们必须在代码中指定属性的内容,代码类似这样:

People peo=newPeople();

Peo.setName(“Stephen White”);

而如果使用SpringIOC机制,我们的代码可以写成这样:

好吧,代码要分成两部分第一部是是配置文件,这是一个XML文件,遵循相应的DTD约束,下面是一个典型的Spring Beans映射文件:

 

<?xml version="1.0" encoding="GBK"?>

<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"

"http://www.springframework.org/dtd/spring-beans.dtd">

 

<beans>

   

    <bean id="Person" class="com.sivce.itbats.Person ">

        <property name="firstName">

            <value>Stpehen</value>

        </property>

    </bean>

   

</beans>

   

   

继续之前,先解释一下这个文件,bean Element指定的 要声明(配置)的类的详细信息(必须指定类的包括包名的全限定名),property element则指定要配置的类的参数信息,比如,我们的类是如下结构:

package com.sivce.itbats;

 

import java.util.Date;

 

public class Person {

    private int id;

    public int getId() {

        return id;

    }

    public void setId(int id) {

        this.id = id;

    }

    public String getFirstName() {

        return firstName;

    }

    public void setFirstName(String firstName) {

        this.firstName = firstName;

    }

    public String getLastName() {

        return lastName;

    }

    public void setLastName(String lastName) {

        this.lastName = lastName;

    }

    public Date getBirthDate() {

        return birthDate;

    }

    public void setBirthDate(Date birthDate) {

        this.birthDate = birthDate;

    }

    public double getWeightInKilograms() {

        return weightInKilograms;

    }

    public void setWeightInKilograms(double weightInKilograms) {

        this.weightInKilograms = weightInKilograms;

    }

    public double getHeightInMeters() {

        return heightInMeters;

    }

    public void setHeightInMeters(double heightInMeters) {

        this.heightInMeters = heightInMeters;

    }

    private String firstName;

    private String lastName;

    private Date birthDate;

    private double weightInKilograms;

    private double heightInMeters;

   

}

那么我们在使用这个类的时候,就不必使用传统方式在程序中控制属性的值,我们可以这样:

package javamxj.spring.beginning3;

 

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.FileSystemXmlApplicationContext;

import com.sivce.itbats.Person;

 

public class Main {

    public static void main(String[] args) {

    Main m=new Main();

   

     m.testQuickStart();

    }

    public void testQuickStart() {

    ApplicationContext ctx=new

    FileSystemXmlApplicationContext("src\\bean.xml");

    Person Person = (Person) ctx.getBean("Person");

    System.out.println("依赖配置文件注入属性,获得人员姓名:"+Person.getFirstName());

   

    }

}

控制台打印的结果就是我们期望的结果:

依赖配置文件注入属性,获得人员姓名:Stpehen

 

虽然从内心深处考虑,我并不认为这样做对强悍的程序有多大用处,但是不可否认,对于传统OA开发,这样做的好处是很明显,下面以数据库配置为例,阐释一下我们用数据库得到连接的另外一种方式:beans,当然,这种方式只是为了完成这篇笔记特别使用的,在其他大多数时候,我们都有比之更好的方法来完成这个功能,依旧在我们的配置文件中,建立一个新的bean

 

虽然从内心深处考虑,我并不认为这样做可以提升程序的运行效率,直到现在依然如此,这么做,甚至是性能有害的,但是对却可以极大的提升软件的可维护性,下面以数据库配置为例,阐释一下我们用数据库得到连接的另外一种方式:beans,当然,这种方式只是为了完成这篇笔记特别使用的,在其他大多数时候,我们都有比之更好的方法来完成这个功能,依旧在我们的配置文件中,建立一个新的bean

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>

        <!-- <property name="url" value="jdbcurl"/>

        <property name="username" value="*******"/>

        <property name="password" value="******"/> -->

        <property name="url" value=" jdbcurl "/>

        <property name="username" value="******"/>

        <property name="password" value="******"/>

        <property name="initialSize" value="1"/>

        <property name="maxActive" value="10"/>

        <property name="maxIdle" value="5"/>

        <property name="minIdle" value="1"/>

    </bean>

编程中,只要将它当做普通的Java;类来处理就可以了,数据库中,使用org.apache.commons.dbcp.BasicDataSource这个类的getConnection()方法可以得到java.sql.Connection 之后的操作就非常容易了,不过记得在用完连接之后手动的释放它。

Java开发有一句话“Every Thing Is Object”在Spring中,我们也可以这样理解“Every  Resources is Beans”,也就是,所有的资源都是Beans数据库连接,作为一个资源,当然也可以用Beans来处理,当刚开始接触一个新的项目的时候,我们会感到茫然失措,原因,无外乎两点,要么技术不熟悉,要么业务不熟悉,要解决这样的问题,作为 ,应该扬长避短,以技术优势,弥补业务若是,我并不是说用技术来为所欲为,而是说,用技术的理念帮助我们理解项目的业务,这个应该是面对新接触的项目的标准指南,如果是和团队一起开发新的项目,应该容易的多,这样已经不存在技术不熟悉的问题了,专心了项目就可以了,对Spring Ioc的理解就是这么多了,这个当然不是Ioc的全部内容,但是了解了这么多,应该足以用Ioc让自己的 项目更加具有可维护性了,其他内容,就是项目的包命名规则了,每个项目都不一样,每个设计师的风格也有所差异,具体体现在项目的如何分层上面,一般,会将业务逻辑、持久化、前端页面相分离,如果采用Ajax的相关内容,项目的变化会更加复杂比如,如果采用了Ajax来进行页面展示和得到数据,那么MVC的优势就不会非常明显,为什么呢?View(JSP)的功能会直接由html+javascript来完成这。应该灵活把握,具体掌握。

编程,意味着自我完善,让自己的思维更加敏锐,Good Luck,My Friend。

还有,掌握新技术的目的,不是放弃旧的技术,而新与旧技术相互融合,使之变成自己的编程力量,比如之前学习了MVC,后来又学习了Ajax技术,乍一看,这两种技术似乎没有多大关系,甚至相互矛盾,Ajax需要异步提交,MVC却必须进行同步处理,在Ajax中引入MVC,或者在MVC中引入Ajax,不是会相互矛盾的吗?这个问题下一篇随笔探讨。

用电子邮件联系Andy