依赖注入

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: • 思考:向一个类中传递数据的方式有几种?• 普通方法(set方法)• 构造方法• 思考:依赖注入描述了再容器中建立bean与bean之间依赖关系的过程,如果bean运行需要的是数字或字符串呢?

依赖注入,自动装配,数据源,容器

依赖注入方式

  • 思考:向一个类中传递数据的方式有几种?
  • 普通方法(set方法)
  • 构造方法
  • 思考:依赖注入描述了再容器中建立bean与bean之间依赖关系的过程,如果bean运行需要的是数字或字符串呢?
  • 引用类型
  • 简单类型(基本数据类型与String)
  • 依赖注入方法
  • setter注入
  • 简单类型

publicclassBookDaoImplimplementsBookDao {

   privateintconnectionNumber;

   publicvoidsetConnectionNumber(intconnectionNumber){

       this.connectionNumber=connectionNumber;

   }

}

  • 配置中使用properry标签value属性注入简单类型数据

<beanid="bookDao"class="com.wangxh.dao.impl.BookDaoImpl">

   <propertyname="connectionNumber"value="10"/>

</bean>

  • 引用类型
  • 构造器注入
  • 简单类型
  • 在bean中定义引用类型属性并提供可访问的构造方法

publicclassBookDaoImplimplemetsBookDao{

   privateintconnectionNumber;

   publicvoidsetConnectionNumber(intconnectionNumber){

       this.connectionNumber=connectionNumber;

   }

}

  • 配置中使用constructor-arg标签value属性注入简单类型数据

<beanid="bookDao"class="com.wangxh.dao.impl.BookDaoImpl">

   <constructor-argname="connectionNumber"value="10"/>

</bean>

  • 配置中使用constructor-arg标签ref属性注入引用类型对象

<beanid="bookService"class="com.wangxh.service.impl.BookServiceImpl">

   <constructor-argname="bookDao"ref="bookDao"/>

</bean>

<beanid = "bookDao"class="com.wangxh.dao.impl.BookDaoImpl"/>

  • 引用类型
  • 在bean中定义引用类型属性并提供可访问的构造方法

publicclassBookServiceImplimplementBookService{

   privateBookDaobookDao;

   publicBookServiceImpl(BookDaobookDao){

       this.bookDao=bookDao;

   }

}

  • 配置中使用constructor-arg标签ref属性注入引用类型对象

<beanid="bookService"class="com.wangxh.service.impl.BookServiceImpl">

   <constructor-argname="bookDao"ref="bookDao"/>

</bean>

<beanid = "bookDao"class="com.wangxh.dao.impl.BookDaoImpl"/>

  • 构造器注入-参数适配(了解)
  • 依赖注入方式选择
  1. 强制依赖使用构造器惊醒,使用setter注入有概率不进行注入导致null对象出现
  2. 可选依赖使用setter注入进行,灵活性强
  3. Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
  4. 如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
  5. 实际开发过程还要根据实际情况分析,如果受控对象没有setter方法就必须使用构造器注入
  6. 自己开发的模块推荐使用setter注入

依赖自动装配

  • IOC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
  • 自动装配方式
  • 类型(常用)
  • 按名称
  • 按构造方法
  • 不启用自动装配
  • 配置中使用bean标签autowire属性设置自动装配的类型

<beanid="bookDao"class="com.wangxh.impl.BookDaoImpl"/>

<beanid="bookService"class="com.wangxh.service.impl.BookServiceImpl"autowire="byType"/>

  • 自动装配用于引用类型依赖注入,不能对简单类型进行操作
  • 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
  • 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
  • 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

数据源对象管理

  • Spring管理第三方资源
  • DruidDataSource
  1. 导入druid坐标

<dependency>

           <groupId>com.alibaba</groupId>

           <artifactId>druid</artifactId>

           <version>1.1.12</version>

       </dependency>

  1. 配置数据源

<beanid="dataSource"class="com.alibaba.druid.pool.DruidDataSource">

       <propertyname="driverClassName"value="com.mysql.jdbc.Driver"/>

       <propertyname="url"value="jdbc:mysql://localhost::3306/spring_db"/>

       <propertyname="username"value="root"/>

       <propertyname="password"value="root"/>

   </bean>

  • ComboPooledDataSource
  1. 导入坐标

<dependency>

           <groupId>c3p0</groupId>

           <artifactId>c3p0</artifactId>

           <version>0.9.1.2</version>

       </dependency>

       <dependency>

           <groupId>mysql</groupId>

           <artifactId>mysql-connector-java</artifactId>

           <version>5.1.48</version>

       </dependency>

  1. 配置数据源

<beanid="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource">

       <propertyname="driverClass"value="com.mysql.jdbc.Driver"/>

       <propertyname="jdbcUrl"value="jdbc:mysql://localhost::3306/spring_db"/>

       <propertyname="user"value="root"/>

       <propertyname="password"value="root"/>

       <propertyname="maxPoolSize"value="10"/>

   </bean>

加载properties

  1. 开启context命名空间

<?xmlversion="1.0" encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xmlns:context="http://www.springframework.org/schema/context"

      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

                          http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd

">

   

这里修改的5个地方:1复制了2行的xmls修改成第3行那样,然后还有xsi里面的那个http复制了一份然后将里面的beans修改成了context

<!--    1.开启context命名空间-->

<!--    2.使用context空间加载properties文件-->

   <context:property-placeholderlocation="jdbc.properties"/>

<!--    3.使用属性占位符${}读取properties文件中的属性-->

   <beanid="dataSource"class="com.alibaba.druid.pool.DruidDataSource">

       <propertyname="driverClassName"value="${jdbc.driver}"/>

       <propertyname="url"value="${jdbc.url}"/>

       <propertyname="username"value="${jdbc.username}"/>

       <propertyname="password"value="${jdbc.password}"/>

   </bean>

5个小知识点

  1. 不加载系统属性

   <context:property-placeholderlocation="jdbc.properties"system-properties-mode="NEVER"/>

  1. 加载多个properties文件

   <context:property-placeholderlocation="jdbc.properties,msg.properties"/>

  1. 加载所有properties文件

   <context:property-placeholderlocation="*.properties"/>

  1. 加载properties文件标准格式

   <context:property-placeholderlocation="classpath:*.properties"/>

  1. 从类路径或jar包中搜索并加载properties文件

   <context:property-placeholderlocation="classpath*:*.properties"/>

容器

  • 创建容器
  1. 方式一:类路劲加载配置文件

ApplicationContextctx=newClassPathXmlApplicationContext("applicationContext.xml");

  1. 方式二:文件路径加载配置文件

ApplicationContextctx=newFileSystemXmlApplicationContext("D:\\applicationContext.xml");

//加载多个配置文件

ApplicationContextctx=newClassPathXmlApplicationContext("bean1.xml","bean2.xml");

  • 获取bean
  1. 方式一:使用bean名称获取

BookDaobookDao= (BookDao) ctx.getBean("bookDao");

  1. 方式二:使用bean名称获取并指定类型

BookDaobookDao=ctx.getBean("bookDao",BookDao.class);

  1. 方式三:使用bean类型获取

BookDaobookDao=  ctx.getBean(BookDao.class);


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
1
0
1
分享
相关文章
kivy打包apk虚拟机搭建指南
这个文档其实是去年搭建虚拟机写的,因为各种原因一直没有发布出来,今天在Kivy中国开发者交流群(群号**534622543**)@lr大佬向我要这个,我于是下定决定把拖延症抢救下,对原来的文档稍作修正发布出来,希望对一心想要自己搭建打包环境却不得其法的朋友有一些帮助,也希望各位路过的大佬不吝赐教,不足之处望请斧正,如果能起到抛砖引玉的效果,本npc就很满足了。
接口文档生成神器-Swagger3
如果你是后端`java`开发程序员,你应该遇到过这样的场景,你的接口写完了,但是没有写接口文档,前端的小姐姐在焦急等待你的文档,那么你可能给小姐姐留下了一个不好的印象,那么有没有一款自动生成接口文档的工具呢? 答案是有,今天它来了。 `swagger`旨在帮助开发者摆脱写文档的烦恼,通过几个简单的注解,就可以生成很全面的接口文档。 本文旨在快速上手使用`swagger`生成接口文档,不得不说`swagger3`真香!!!
PDF转Word有那么难吗?做一个文件转换器,都解决了
这个小工具软件主要针对两个文件格式的转换,一个是针对KML文件对KML文件里面的经纬度的提取和生成,另一个是对PDF文件的格式转换,相信大家用过WPS,WPS的PDF转换是需要开会员才能转,所以我想自己写一个小工具软件,给大家白嫖一下,由于第一次做这种软件有个别考虑不周到的地方,希望大家谅解,我继续学习给大家做更好更优质的小工具给大家使用。文章最后贴了源码和软件安装包大家下载安装就可以用了,源码在后面大家想要继续增加功能也可以,这个小工具是用C#开发的,有一点点小bug不影响使用。家人们建议点赞收藏,你的点赞是我更文的动力。
374 0
PDF转Word有那么难吗?做一个文件转换器,都解决了
「连接平台」OA审批一键连接-ERP财务单据“如影随形”
集简云与钉钉深度融合,通过钉钉OA审批数据与金蝶云星空(例如组织架构、物料等)关系映射,自动将钉钉单据数据同步到金蝶云星空系统并自动生成财务单据,让企业应用软件通过完全界面化无代码的操作方式完成自动化流程的搭建,助力企业实现审批流程移动化和低成本数字化转型。
办公利器!用Python快速将任意文件转为PDF
**痛点:** 相信大家都会遇到一种**场景**。老师/上司要求你把**某个文件转为pdf**,并且是一批(不止一个,一个的话手动就可以搞定),并且这种是枯燥无聊的工作,既没有什么技术含量又累。
625 0
启动 Tomcat 日志乱码问题
大家在Windows 启动 Tomcat 应该都会遇到中文乱码,其实也不影响使用,但是笔者看着这个乱码难受,于是提供两种较简单的解决方案。
启动 Tomcat 日志乱码问题
JupyterLab 出 Windows 桌面版了!
Jupyter最近迎来了一个劲爆的更新:JupyterLab 发布了桌面APP版本!知道以后,马上第一时间码字来告诉大家。
JupyterLab 出 Windows 桌面版了!
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等