知识大全 Spring 依赖注入原理学习

Posted

篇首语:知识才智是实践经验的总结。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Spring 依赖注入原理学习相关的知识,希望对你有一定的参考价值。

Spring 依赖注入原理学习  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  首先我们来看看 Spring 参考文档的 执行SQL语句 这里有个代码片断

  

  import javax sql DataSource; import sprire JdbcTemplate; public class ExecuteAStatement private JdbcTemplate jt; private DataSource dataSource; public void doExecute() jt = new JdbcTemplate(dataSource); jt execute( create table mytable (id integer name varchar( )) ); public void setDataSource(DataSource dataSource) this dataSource = dataSource;

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

  

  DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource setDriverClassName( hsqldb jdbcDriver ); dataSource setUrl( jdbc:hsqldb:hsql://localhost: ); dataSource setUsername( sa ); dataSource setPassword( );

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

  

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

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

  

  import springframework jdbc datasource DriverManagerDataSource; public class TestTemplate public static void main(String[] args) // 新建一个数据源对象 DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource setDriverClassName( hsqldb jdbcDriver ); dataSource setUrl( jdbc:hsqldb:hsql://localhost: ); dataSource setUsername( sa ); dataSource setPassword( ); // 新建一个ExecuteAStatement 对象 ExecuteAStatement eas = new ExecuteAStatement(); // 给执行表达式的对象关联数据源(也就是常说的注入 通过 JavaBean 的 setXxx 方法关联起来) eas setDataSource(dataSource); // 执行功能代码 eas doExecute();

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

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

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

  

  ExecuteAStatement 类代码保持不变 多了个 beans xml:<?xml version= encoding= UTF ?><beansxmlns= xmlns:xsi= instance xsi:schemaLocation= beans xsd >

  <bean id= userDAO class= ExecuteAStatement ><property name= dataSource ><ref bean= myDataSource /></property></bean>

  <bean id= myDataSource class= springframework jdbc datasource DriverManagerDataSource ><property name= driverClassName ><value> hsqldb jdbcDriver</value></property><property name= url ><value>jdbc:hsqldb:hsql://localhost:</value></property><property name= username ><value>sa</value></property><property name= password ><value></value></property> </bean>

  </beans>

  测试类

  

  import ntext ApplicationContext; import ntext support ClassPathXmlApplicationContext; public class Test public static void main(String[] args) throws IOException ApplicationContext context = new ClassPathXmlApplicationContext( beans xml ); ExecuteAStatement eas =(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 bean = new ExecuteAStatement()

  springEngine put( userDAO bean )

  再往下执行 发现 property 定义

  <property name= dataSource >

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

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

  

  <bean id= myDataSource class= springframework jdbc datasource DriverManagerDataSource > <property name= driverClassName > <value> hsqldb jdbcDriver</value> </property> <property name= url > <value>jdbc:hsqldb:hsql://localhost:</value> </property> <property name= username > <value>sa</value> </property> <property name= password > <value></value> </property> </bean>

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

  

  // 新建一个数据源对象 DriverManagerDataSource bean = new DriverManagerDataSource(); bean setDriverClassName( hsqldb jdbcDriver ); bean setUrl( jdbc:hsqldb:hsql://localhost: ); bean setUsername( sa ); bean setPassword( );

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

  springEngine put( myDataSource bean )

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

  // 省略类型转换的代码

  springEngine get( userDAO ) setDataSource(springEngine get( myDataSource ))

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

  所以最后写代码调用

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

cha138/Article/program/Java/ky/201311/28844

相关参考

知识大全 spring依赖注入的3种实现方式

cha138/Article/program/Java/JSP/201311/20117

知识大全 模拟spring框架注入实现原理

  定义一些抽象的方法  [java]  packagehuxinspringinjectdao;  publicinterfacePerson  publicvoidsave();  publicv

知识大全 自然的访问spring容器中的bean

   Spring依赖其IOC特征轻松的管理著一堆非常有价值的bean这些bean在spring容器中的依赖关系都已注入好所以相互调用非常方便  但既然是有价值的bean

知识大全 Spring中DI设置器注入

Spring中DI设置器注入  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java的反射机制可

知识大全 spring中bean的注入方式的选择

  在spring中提供了三种可供选择的注入方式  提供set/get方法  构造函数  工厂方法的运用  大家对这三种方法的选择都是仁者见仁智者见智一下我是我支构造函数的理由  保证一些重要的属性在

知识大全 对Spring中接口注入的理解实例分析

对Spring中接口注入的理解实例分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Type接

知识大全 分享Spring中接口注入的三种方式

分享Spring中接口注入的三种方式  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  下面是Spr

知识大全 Spring的三种注入方式都是什么

Spring的三种注入方式都是什么?如何选用?  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!接口注

知识大全 Spring强制向servlet中注入bean的方法

Spring强制向servlet中注入bean的方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 控制反转思想的理解实例

  通过依赖注入来从不同的部门获取数据借助其来理解Spring的IOC  [java]  packagexliocdemo;  publicinterfaceDataManagement  //使用该