zoukankan      html  css  js  c++  java
  • 什么是依赖注入

        最近学习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,不是会相互矛盾的吗?这个问题下一篇随笔探讨。

  • 相关阅读:
    1014 Waiting in Line (30)(30 point(s))
    1013 Battle Over Cities (25)(25 point(s))
    1012 The Best Rank (25)(25 point(s))
    1011 World Cup Betting (20)(20 point(s))
    1010 Radix (25)(25 point(s))
    1009 Product of Polynomials (25)(25 point(s))
    1008 Elevator (20)(20 point(s))
    1007 Maximum Subsequence Sum (25)(25 point(s))
    1006 Sign In and Sign Out (25)(25 point(s))
    1005 Spell It Right (20)(20 point(s))
  • 原文地址:https://www.cnblogs.com/MicroGoogle/p/2276404.html
Copyright © 2011-2022 走看看