`
wanbin021614
  • 浏览: 27664 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring 依赖注入原理入门学习

阅读更多
首先我们来看看 Spring 参考文档的 11.2.6. 执行SQL语句 这里有个代码片断:
importjavax.sql.DataSource;
importorg.springframework.jdbc.core.JdbcTemplate;
publicclassExecuteAStatement...{
privateJdbcTemplatejt;

privateDataSourcedataSource;
publicvoiddoExecute()...{

jt
=newJdbcTemplate(dataSource);

jt.execute(
"createtablemytable(idinteger,namevarchar(100))");

}

publicvoidsetDataSource(DataSourcedataSource)...{

this.dataSource=dataSource;

}

}

这个就是普通的 Java 类, 再参考 11.2.4. DataSource接口, 这里的另一个代码片断:

DriverManagerDataSourcedataSource=newDriverManagerDataSource();
dataSource.setDriverClassName(
"org.hsqldb.jdbcDriver");
dataSource.setUrl(
"jdbc:hsqldb:hsql://localhost:");
dataSource.setUsername(
"sa");
dataSource.setPassword(
"");

  当然上面的连接方式可以配置成我们课程里面介绍的 MyEclipse Derby 的数据库连接:

org.apache.derby.jdbc.ClientDriver
jdbc
:derby://localhost:1527/myeclipse;create=true
app
app

我们可以写一个测试类来执行代码:

importorg.springframework.jdbc.datasource.DriverManagerDataSource;
publicclassTestTemplate...{
publicstaticvoidmain(String[]args)...{
//新建一个数据源对象
DriverManagerDataSourcedataSource=newDriverManagerDataSource();
dataSource.setDriverClassName(
"org.hsqldb.jdbcDriver");
dataSource.setUrl(
"jdbc:hsqldb:hsql://localhost:");
dataSource.setUsername(
"sa");
dataSource.setPassword(
"");

//新建一个ExecuteAStatement对象
ExecuteAStatementeas=newExecuteAStatement();
//给执行表达式的对象关联数据源(也就是常说的注入,通过JavaBean的setXxx方法关联起来)
eas.setDataSource(dataSource);
//执行功能代码
eas.doExecute();
}

}

  这个代码可以跑通, 就是普通的编程方式, 大家可以去看刚才介绍的文档附近的详细说明。

  那么如果用 Spring 来做, 代码会变成这样:

  ExecuteAStatement 类代码保持不变, 多了个 beans.xml:

ExecuteAStatement类代码保持不变,多了个beans.xml:
<?xmlversion="1.0"encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

<beanid="userDAO"class="ExecuteAStatement">
<propertyname="dataSource">
<refbean="myDataSource"/>
</property>
</bean>

<beanid="myDataSource"
class
="org.springframework.jdbc.datasource.DriverManagerDataSource">
<propertyname="driverClassName">
<value>org.hsqldb.jdbcDriver</value>
</property>

<propertyname="url">
<value>jdbc:hsqldb:hsql://localhost:</value>
</property>

<propertyname="username">
<value>sa</value>
</property>

<propertyname="password">
<value></value>
</property>
</bean>

</beans>


测试类:

importorg.springframework.context.ApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
publicclassTest...{
publicstaticvoidmain(String[]args)throwsIOException...{
ApplicationContextcontext
=newClassPathXmlApplicationContext("beans.xml");
ExecuteAStatementeas
=(ExecuteAStatement)context.getBean("userDAO");
//执行功能代码
eas.doExecute();
}

}

  和上面的 TestTemplate 类相比, 就会发现 new DriverManagerDataSource() 这个过程不用我们写了, 运行的时候会发现一切都执行的好好的, 也就是常说的 ExecuteAStatement 的 dataSource 这个属性被注入了。

  那么这个过程到底该如何理解呢? Spring 是一个对象池, 可以简化为一个 Map, 存多个主键和对象的映射。 那么 Spring 运行的过程中, 会根据 beans.xml 一步步进行必要的解析工作:

  Map springEngine = new HashMap();

  OK, 解析到了

  <bean id="userDAO" class="ExecuteAStatement">, 发现 bean 定义, 那就新建一个实例存到对象池里吧, 主键就是 userDAO, 值就是对象:

  ExecuteAStatement bean1 = new ExecuteAStatement();

  springEngine.put("userDAO", bean1);

  再往下执行, 发现 property 定义:

  <property name="dataSource">

  到了这里, 就知道应该调用 bean1.setDataSource(DataSource) 方法了。 可以接着执行, 发现

  <ref bean="myDataSource" />, 哦, 这个方法的参数还没有呢, 是个 bean 的引用, 好了, 要调用这个方法, 还是先 new 一个名字为 myDataSource 的 bean2 吧。 就跳到下面寻找 myDataSource 的定义, 找到了:

<beanid="myDataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<propertyname="driverClassName">
<value>org.hsqldb.jdbcDriver</value>
</property>
<propertyname="url">
<value>jdbc:hsqldb:hsql://localhost:</value>
</property>
<propertyname="username">
<value>sa</value>
</property>
<propertyname="password">
<value></value>
</property>
</bean>

  像以前一样, 先实例化这个类, 然后看到 property 表情就调用对应的 setXxx() 这样的方法, 相当于下面一段代码:

//新建一个数据源对象
DriverManagerDataSourcebean2=newDriverManagerDataSource();
bean2.setDriverClassName(
"org.hsqldb.jdbcDriver");
bean2.setUrl(
"jdbc:hsqldb:hsql://localhost:");
bean2.setUsername(
"sa");
bean2.setPassword(
"");

  不是还有个 bean 的 id 名字为 myDataSource 嘛, 那就把它存到对象池里面:

  springEngine.put("myDataSource", bean2);

  好了, 最后就是把他们两个关联起来了, 通过 ref 里指定的 bean id 名来关联起来:

  // 省略类型转换的代码

  springEngine.get("userDAO")。setDataSource(springEngine.get("myDataSource"));

  最后返回给用户的就是一个对象池(一个 Map)了, 所以别人调用的时候, 就发现 springEngine.get("userDAO") 回来的类的 dataSource 属性已经被实例化过了, 这些都是 Spring 幕后工作的代码, 通过反射机制来实现。

  所以最后写代码调用:

  context.getBean("userDAO") 的时候, 得到的是 ExecuteAStatement, 这时候还有一个 myDataSource, 也可以被调用:

  context.getBean("myDataSource"), 得到的是 DriverManagerDataSource.

分享到:
评论

相关推荐

    JavaEE spring 依赖注入DI入门案例

    JavaEE spring 依赖注入DI入门案例

    spring依赖注入基础知识.rar

    下面我们将深入探讨Spring依赖注入的基础知识。 一、依赖注入的概念 依赖注入是一种设计模式,它将一个对象所需要的服务(依赖)通过构造函数、setter方法或者配置文件等方式传入,而不是由对象自己创建或查找依赖...

    Spring依赖注入——java项目中使用spring注解方式进行注入.rar

    在Java开发领域,Spring框架是应用最广泛的轻量级框架之一,它提供了强大的依赖注入(Dependency Injection,简称DI)功能,极大地简化了组件之间的耦合。本知识点将深入探讨Spring框架如何通过注解方式实现依赖注入...

    Spring Ioc(依赖注入)入门例子--属性注入

    在本例“Spring Ioc(依赖注入)入门例子--属性注入”中,我们将关注如何通过属性注入来管理依赖。 属性注入是指Spring容器将一个对象的属性值设置为另一个对象的引用。这通常用于将服务对象注入到需要使用它们的...

    Spring_依赖注入_面向接口编程_不同加载方式

    本项目以"Spring_依赖注入_面向接口编程_不同加载方式"为主题,旨在帮助初学者理解Spring的核心特性——依赖注入(Dependency Injection,简称DI),以及如何通过面向接口编程来提高代码的可维护性和可扩展性。...

    详解Spring基于Annotation的依赖注入实现

    在深入探讨Spring框架中基于注解(Annotation)的依赖注入(Dependency Injection,简称DI)实现之前,我们首先需要理解几个核心概念:Spring框架、依赖注入、以及注解本身。 ### Spring框架简介 Spring框架是一个...

    spring 控制反转和依赖注入.docx

    Spring 控制反转和依赖注入基础知识详解 Spring 框架是 Java 企业级开发的轻量级开发框架,于 2003 年创建,主要用于解决企业级开发的复杂性。其主要优势在于分层架构,允许在不同层级中使用一个组件(其他框架)...

    spring依赖注入

    Spring依赖注入是Java开发中的核心概念,特别是在使用Spring框架时,它是实现松耦合和可测试性的重要机制。依赖注入(Dependency Injection,简称DI)允许我们解耦组件之间的关系,使得代码更易于维护和扩展。它通过...

    Spring_01_入门篇_依赖注入(控制反转)_ANN

    在"Spring_01_入门篇_依赖注入(控制反转)_ANN"的学习过程中,你可以首先了解Spring的基本概念和IoC/DI原理,然后通过注解驱动的配置来实践创建和管理bean。接着,逐步探索三层架构的实现,从编写DAO、Service到...

    spring.net依赖注入Demo

    **Spring.NET依赖注入(DI)和控制反转(IOC)概念** Spring.NET是一个针对.NET平台的开源框架,它引入了依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IOC)的设计模式,使得...

    Spring依赖包和配置文件

    总结来说,Spring依赖包和配置文件是Spring框架开发的基础,它们协同工作,为开发者提供了高效、灵活的应用程序构建工具。正确理解和使用这些组件,能够显著提升开发效率和代码质量。在实际项目中,还需要结合具体...

    Spring依赖注入

    Spring依赖注入是Spring框架的核心特性之一,它是一种设计模式,旨在降低组件之间的耦合,提高代码的可测试性和可维护性。依赖注入(Dependency Injection,简称DI)的主要思想是,对象不应该负责查找或创建它所依赖...

    spring依赖包

    1. **Spring Core**:这是Spring的基础,提供了依赖注入(DI)和容器的核心功能。DI允许将对象之间的依赖关系解耦,使得代码更易于测试和维护。 2. **Spring Beans**:定义了bean工厂,它是Spring容器的实现,负责...

    spring3.0依赖注入详解

    ### Spring 3.0依赖注入详解 #### 引言 Spring框架自2.0版本起,不断优化其依赖注入机制,引入了一系列注解以简化Java应用程序的开发过程。特别是Spring 3.0版本,对依赖注入(DI)进行了深度拓展,引入了基于...

    spring 注入原理

    在Java开发领域,Spring框架无疑占据着举足轻重的地位,尤其在企业级应用中,Spring的依赖注入(Dependency Injection,DI)特性极大地简化了对象之间的依赖管理,使得代码更加模块化、可测试和可维护。本文将深度...

    Spring_01_入门篇_依赖注入(控制反转)_XML

    在`Spring_01_入门篇_依赖注入(控制反转)_XML`中,我们可以看到一个或多个XML配置文件,它们定义了bean的定义,包括bean的类名、属性以及它们之间的依赖关系。例如: ```xml ``` 在这个例子中,`exampleBean`...

    JavaEE技术-试验九.zip_Spring入门_依赖注入

    JavaEE技术实验九的核心主题是Spring框架的入门与依赖注入,以及结合Hibernate框架进行数据库操作。这个实验旨在帮助开发者理解如何在MyEclipse环境中利用Spring框架来实现服务层(Service Layer)和数据访问对象层...

    Spring-注入依赖,AOP,自动注入Bean

    结合上述内容,mySpring这个压缩包可能包含了Spring框架的基础示例,包括如何配置和使用依赖注入、AOP以及自动注入Bean。通过学习这些内容,开发者能够更好地理解和掌握Spring框架的核心特性和使用方式,为构建高效...

    spring底层的学习之路

    本资料包"Spring学习之路"深入浅出地介绍了Spring的底层原理以及如何搭建一个完整的Spring MVC项目,对于初学者来说是极好的学习资源。 首先,我们要了解Spring的核心概念——IoC(Inversion of Control)和DI...

Global site tag (gtag.js) - Google Analytics