新闻中心

将想法与焦点与您共享

>2012JAVA认证:Spring的学习原理是注入
作者:中国IT实验室    来源:中国IT实验室    发布时间:2012-05-03      浏览次数:7556
分享到:
欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

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

    import javax.sql.DataSource;import org.springframework.jdbc.core.JdbcTemplate;public class ExecuteAStatement public void setDataSource }

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

    DriverManagerDataSource dataSource = new DriverManagerDataSource;dataSource.setDriverClassName;dataSource.setUrl;dataSource.setUsername;dataSource.setPassword;

    当然膳缦沔的毗连体例可以设置装备摆设成我们课程琅缦沔介绍的 MyEclipse Derby 的数据库毗连:

    org.apache.derby.jdbc.ClientDriverjdbc:derby://localhost:1527/myeclipse;create=trueappapp

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

    import org.springframework.jdbc.datasource.DriverManagerDataSource;public class TestTemplate }

    这个代码可以跑通, 就是通俗的编程体例, 巨匠可以去看适才介绍的文档四周的具体声名。

    那么假如用 Spring 来做, 代码会酿成这样:

    ExecuteAStatement 类代码连结不变, 多了个 beans.xml:

    ExecuteAStatement 类代码连结不变, 多了个 beans.xml:

    ?xml version=“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/beans

    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

    bean id=“userDAO”

    property name=“dataSource”

    ref bean=“myDataSource” /

    /property

    /bean

    bean id=“myDataSource”

    property name=“driverClassName”

    valueorg.hsqldb.jdbcDriver/value

    /property

    property name=“url”

    valuejdbc:hsqldb:hsql://localhost:/value

    /property

    property name=“username”

    valuesa/value

    /property

    property name=“password”

    value/value

    /property

    /bean

    /beans

    测试类:

    import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test }

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

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

    Map springEngine = new HashMap();

    OK, 解析到了

    bean id=“userDAO” , 发现 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 的界说, 找到了:

    bean id=“myDataSource”property name=“driverClassName”valueorg.hsqldb.jdbcDriver/value/propertyproperty name=“url”valuejdbc:hsqldb:hsql://localhost:/value/propertyproperty name=“username”valuesa/value/propertyproperty name=“password”value/value/property /bean

    像以前一样, 先实例化这个类, 然后看到 property 神色就挪用对应的 setXxx() 这样的体例, 相当于下面一段代码:

    // 新建一个数据源对象DriverManagerDataSource bean2 = new DriverManagerDataSource;bean2.setDriverClassName;bean2.setUrl;bean2.setUsername;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.

4000-880-989
(24小时热线)
联系客服
微信公众号

官方公众号

小程序

©2008-2022 CORPORATION ALL Rights Reserved. 昆明奥远科技有限公司版权所有 滇ICP备09003328号-1 滇公网安备 53011102000818号 增值电信业务经营许可证号:滇B2-20110045
昆明那家网络公司好,新媒体运营,网站优化,网络推广,网站建设,网页设计,网站设计,网站推广,云南网站公司,昆明新媒体公司,云南网红主播,昆明SEO公司,昆明网站建设,昆明网络推广,昆明网站优化,昆明网站推广,红河网站建设,大理网络公司,曲靖网络公司,丽江网站设计,昭通网络公司,保山大数据服务,智慧高速建设,智慧校园服务,云南IDC服务商,网络安全测评,等保测评,网站关键词排名优化服务,服务客户尽超2000余家,一切尽在奥远科技,服务电话:13888956730