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

  • 相关阅读:
    nginx配置文件中的location中文详解
    binlog、redo log、undo log区别
    OLTP和OLAP的区别
    MPP、SMP、NUMA概念介绍
    NUMA体系结构介绍
    在Linux下判断系统当前是否开启了超线程
    NUMA的取舍与优化设置
    LRU缓存算法
    optimize table
    使用innodb_force_recovery解决MySQL崩溃无法重启问题
  • 原文地址:https://www.cnblogs.com/MicroGoogle/p/2276404.html
Copyright © 2011-2022 走看看