什么是依赖注入
2011-12-05 09:57 jinze 阅读(3537) 评论(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”);
而如果使用Spring的IOC机制,我们的代码可以写成这样:
好吧,代码要分成两部分第一部是是配置文件,这是一个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,不是会相互矛盾的吗?这个问题下一篇随笔探讨。