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.

spring依赖注入的实现原理 NULL 博文链接:https://matchless1688.iteye.com/blog/1038302 立即下载

相关推荐

利用PLECS实现Boost变换器的闭环控制仿真与优化

本文详细介绍了如何利用PLECS仿真软件实现Boost变换器的闭环控制与优化。从基础原理到开环系统搭建,再到闭环控制设计与动态优化,提供了完整的仿真实践指南。通过PLECS的仿真功能,工程师可以有效诊断问题、优化参数,并实现高性能的DC-DC变换器设计。

weixin_42527401的博客 325

Spring之依赖注入原理

依赖注入是 spring 框架核心 IOC 的具体实现,也是面试常问的考点。

qq_14946371的博客 1422

Windows 11 24H2 外接显卡坞兼容性实测:3步解决USB设备失效

本文详细解析了Windows 11 24H2系统下外接显卡坞导致USB设备失效的问题,并提供了三步终极解决方案:驱动预解压与手动更新、电源管理设置调整、优化的设备连接顺序。通过雷电3接口的兼容性优化,帮助用户解决键盘鼠标卡死等常见问题,提升外接显卡坞的稳定性与性能。

weixin_31714129的博客 585

传智播客 srping依赖注入原理详解

     所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。当spring容器启动后,spring容器初始化,创建并管理bean对象,以及销毁它。所以我们只需从容器直接获取Bean对象就行,而不用编写一句代码来创建bean对象。这种现象就称作控制反转,即应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转

JAVA专栏 4268

【R】非参数秩和检验(Kruskal-Wallis H)与事后多重比较邓肯检验(Dunn‘s Test)及自动字母标记

非参数检验-Kruskal-Wallis H检验-多个独立样本秩和检验-事后两两比较-邓肯检验(Duncan's test)

captain_keating的博客 6534

从solidworks导出URDF模型

一、下载sw_urdf_exporter插件 ROS目前提供了SolidWorks转URDF的插件,叫做sw_urdf_exporter,从http://wiki.ros.org/sw_urdf_exporter下载sw2urdfSetup.exe文件,下载后点击安装,安装完成后就能在solidworks中导出URDF模型了。 二、创建solidworks模型 下面以较为简单的四轮小车为例进行说...

weixin_45168199的博客 4万+

Spring 的依赖注入原理

Spring的依赖注入原理

golove666的博客 2030

编写一个程序实现顺序表的各种基本运算(假设顺序表的元数基本类型为Char)

/* *Copyright (c) 2016, 烟台大学计算机学院 *All rights reserved. *文件名称:main.cpp *作者:张旺华 *完成日期: 2016 年 7 月 1 日 *版本号:v1.0 *问题描述:编写一个程序实现顺序表的各种基本运算(假设顺序表的元数基本类型为Char) * */ #include #include #include

张旺华的博客 1万+

spring——依赖注入原理及注入方式

总结来说,依赖注入的原理是通过将对象的依赖关系由外部容器来管理和注入,从而解耦组件之间的依赖关系,提高代码的灵活性、可维护性和可测试性。是通过在对象的构造函数、属性或方法中注入所依赖的对象,而不是在对象内部创建或获取依赖对象。这样,对象的依赖关系由外部容器来管理,对象只需要关注自身的核心功能,而不需要关心如何获取依赖对象。(6)使用目标对象:完成依赖注入后,可以通过目标对象的其他方法或属性来使用注入的依赖对象。🟠(1)定义对象的依赖属性:在目标对象中定义一个或多个私有属性,用于存储依赖对象的引用。

yangqiqi1997的博客 4458

Mac 下 OpenClaw 安装全记录:从零到一的保姆级图文教程

本文主要介绍了Mac 下 OpenClaw 安装全记录:从零到一的保姆级图文教程,希望能对学习使用OpenClaw 的同学们有所帮助。 文章目录 1. 背景 2. 安装教程 2.1 安装OpenClaw 2.2 配置模型 2.3 对话 3. 后续使用步骤 4. 关闭程序

weixin_43178406的博客 11万+

从零开始讲DDR(8)——AXI 接口MIG 使用(1)

我们简单拆解了MIG AXI接口中测试文件的整体框架,首先在sim_tb_top.sv文件中例化了DDR模型和example_top。在example_top中,又例化了MIG IP和一个流量产生器ddr4_v2_2_8_axi_tg_top。在ddr4_v2_2_8_axi_tg_top中的主要功能是分别例化了boot_mode_gen,prbs_mode_gen,custom_mode_gen和axi_opcode_gen。

apple_53311083的博客 1587

Spring的依赖注入原理浅析

最近学习中分析了下spring的控制反转,将思考Mark下 Spring的依赖注入依靠了动态代理和反射 最初我认为Spring的扫包时通过反射实例化了类,但是有个问题一直想不通 就是反射的方式获取实例时有可能会抛出异常,但是在手动获取Spring管理的对象时却不需要捕捉异常,当时懵了半天的我甚至猜测Spring是不是用了什么我不知道的方式实例化对象,后来想了下Spring再厉害也不可能跳出Ja...

纵马饮白虹的博客 5332

YOLOv5算法改进(21)— 添加CA注意力机制 + 更换Neck网络之BiFPN + 更换损失函数之EIoU

本节课作者就结合论文对YOLOv5进行组合改进(添加CA注意力机制+更改Neck网络之BiFPN+更换损失函数之EIoU),小白必学!

小哥谈 2820

Spring框架入门

​本篇文章主要从**什么是spring**、**spring入门案例**、**spring创建对象的原理**等方面进行对spring入门的学习。

LYH2771994122的博客 1148

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Spring概述与核心概念学习 -- Spring入门(一)

为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。(博客的参考源码以及可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)Spring Framework 是一个功能强大的 Java 应用程序框架,旨在提供高效且可扩展的开发环境。它结合了轻量级的容器(IOC)和依赖注入(DI)

m0_74825541的博客 1020

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

spring全面详解-最全最详细的spring基本认识和入门使用

Spring是一款主流的Java EE 轻量级开源框架,目的是用于简化Java企业级引用的开发难度和开发周期。从简单性、可测试性和松耦合度的角度而言,任何Java应用都可以从Spring中受益。Spring框架提供自己提供功能外,还提供整合其他技术和框架的能力。Spring自诞生以来备受青睐,一直被广大开发人员作为Java企业级应用程序开发的首选。时至今日,Spring俨然成为了Java EE的代名词,成为了构建Java EE 应用的事实标准。

m0_74825172的博客 874

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

框架 ---Spring spring概述 入门 搭建环境 分模块开发等 no 01.

1.0Spring的学习路线 Spring的概述,SpringIOC入门(XML),Spring的Bean管理,Spring属性注入 Spring的IOC的注解方式,Spring的AOP开发(XML) Spring的AOP的注解开发,Spring的声明式事务。JdbcTemplate SSH的整合,HibernateTemplate的使用,OpenSessionInViewFilter的使用。 ...

x.1000001000的博客 235

day1_Spring

Spring框架主要的优势是在简化开发和框架整合上(1)IOC,(2)整合Mybatis(IOC的具体应用),(3)AOP,(4)声明式事务(AOP的具体应用)IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程。

weixin_68010168的博客 226

总结

通过这周的学习对Spring框架有了一定的认识,学习了applicationContext.xml配置文件编写、IoC思想、DI依赖注入、使用AspectJ进行切面编程、JdbcTemplate模板使用、声明式事务管理、SSM的整合,还对mybatis框架有了一定的认识。Spring框架的学习1.applicationContext.xml配置文件编写2.IoC思想3.DI依赖注入4.使用Aspe...

qq_40886491的博客 198

Spring

spring核心概念介绍及实例演示

2201_75736541的博客 132

Spring学习第4篇:Spring 的依赖注入

依赖注入:Dependency Injection。它是 spring 框架核心 ioc 的具体实现。我们的程序在编写时,通过控制反转,把`对象的创建`交给了 `spring`,但是代码中不可能出现没有依赖的情况。例如:我们的`controller`层仍会调用`service`层的方法。那这种`controller`和`service`层的依赖关系,在使用 `spring` 之后,就让 `spring` 来维护了。简单的说,就是坐等框架把`service`层对象传入`controller`层。

怪咖@的博客 5934

Spring依赖注入

1.依赖注入简介 2. setter注入 3. 构造器注入 4. 自动装配

HHX_01的博客 1617

四、Spring依赖注入原理分析

spring ioc bean 注册和实例化流程

追梦的土豆的博客 1105
上一篇: 整合 JSF+Spring+Hibernate的小例子
下一篇: TOMCAT的一个中文问题
alex_wan
博客等级 码龄20年 2粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值