依赖注入

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 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);


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
XML Java 数据格式
依赖注入~
依赖注入~
|
Java 测试技术 容器
Spring框架-ObjectProvider更加宽泛的依赖注入
从上面的过程中我们可以看出,但Spring中某个Bean的依赖类型为ObjectProvider时,我们不需要提供一个ObjectProvider类型的Bean到容器中,只需要提供一个T类型的Bean到容器中,容器会自动将其包装成一个ObjectProvider,然后注入到依赖中
196 0
|
3月前
|
设计模式 Java 开发者
面向切面编程和依赖注入
【9月更文挑战第6天】在软件开发中,面向切面编程(AOP)和依赖注入(DI)是提升代码可维护性、可扩展性和可测试性的关键概念。AOP 通过将横切关注点(如日志记录、事务管理)从业务逻辑中分离并模块化管理,增强了代码的清晰度和灵活性;DI 则通过外部容器管理对象间的依赖关系,降低了对象耦合度,使代码更易测试和维护。两者结合使用能显著提升软件开发效率和质量。
|
4月前
|
设计模式 测试技术 容器
依赖注入与控制反转:理解与应用
【8月更文挑战第22天】
129 0
|
设计模式 Java Spring
依赖注入
依赖注入
|
Java Maven
SpringFrame-ioc 依赖注入
SpringFrame-ioc 依赖注入
|
SQL 开发框架 安全
3.1依赖注入
传统开发中,对象都是开发者创建组装,开发者必须了解各类的使用方法且某些类的耦合度较高,例如想把sql serve数据库改为MySql数据库则需要更改某些代码。控制反转的目的是让框架完成对象的创建和组装。从“我创建对象”编程“我要对象”
|
程序员 容器
控制反转与依赖注入
控制反转与依赖注入
129 0
控制反转与依赖注入
|
XML 架构师 关系型数据库
|
自动驾驶 小程序 Java
什么是控制反转(IOC)?什么是依赖注入?
什么是控制反转(IOC)?什么是依赖注入?
什么是控制反转(IOC)?什么是依赖注入?