【SSH快速进阶】——Spring IOC容器注入的几种方式

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:   **IOC(Inversion of Control)**:控制反转,怎么理解这句话呢?看一个例子就明白了。  一个操作用户的Dao层接口UserDao :

  **IOC(Inversion of Control)**:控制反转,怎么理解这句话呢?看一个例子就明白了。

  一个操作用户的Dao层接口UserDao :


public interface UserDao {
  public void addUser(String username,String password);
}


  UserDao 的两个实现类(Oracle版本和MySql版本):

public class UserDao4OracleImpl implements UserDao{
  @Override
  public void addUser(String username, String password) {
    System.out.println("UserDao4Oracle实现添加用户");
  }
}


public class UserDao4MySqlImpl implements UserDao {
  @Override
  public void addUser(String username, String password) {
    System.out.println("UserDao4MySqlImpl实现添加用户");
  }
}


  在Service的实现类中调用UserDao接口时,需要手动new实现该接口的实现类:


public class UserManagerImpl implements UserManager{
  @Override
  public void addUser(String username, String password) {
    //由应用程序自己来负责服务(对象)定位
    UserDao userDao =new UserDao4MySqlImpl();
    userDao.addUser("DannyHoo", "123456");
  }
}


 在上面的代码看出来,在使用userDao接口时,需要在这里主动找mysql的实现类UserDao4MySqlImpl,而IOC的工作就是自动为我们实例化。


 控制反转的意思在这里就体现出来了,把原本由程序管理Bean的工作(实例化、各种依赖引用等)反交给IOC容器来做。


 利用IOC容器来为我们管理Bean的方式有多种:



1、构造方法注入


 在需要注入的Service实现类中添加userDao的引用,一个构造方法,参数为需要注入的userDao:


public class UserManagerImpl implements UserManager{
  //用构造方法构造UserDao,不依赖具体实现
  private UserDao userDao;
  //如果有多个依赖,构造方法可以配置多个参数
  public UserManagerImpl(UserDao userDao){
    this.userDao=userDao;
  }
  @Override
  public void addUser(String username, String password){
    userDao.addUser(username,password);
  }
}


  上面用构造方法构造UserDao,不依赖具体实现。

  在Spring配置文件中的配置如下


<bean id="userDao4MySql" class="com.danny.spring.dao.UserDao4MySqlImpl"></bean>
<bean id="userDao4Oracle" class="com.danny.spring.dao.UserDao4OracleImpl"></bean>
<bean id="userManager" class="com.danny.spring.manager.UserManagerImpl">
  <!-- 依赖查找,可以构造多个参数依赖,顺序随意 -->
  <constructor-arg ref="userDao4MySql"/>
</bean>  


2、Setter注入


  Setter注入就是用Setter方法代替了上面的构造方法,IOC容器利用Setter方法来给需要注入的引用赋值。这是最常用的方式。


  添加Setter 方法:


public class UserManagerImpl implements UserManager{
  private UserDao userDao;
  //setter注入
  public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
  }
  @Override
  public void addUser(String username, String password) {
    userDao.addUser(username,password);
  }
}

  在Spring配置文件中的配置如下


<bean id="userDao4MySql" class="com.danny.spring.dao.UserDao4MySqlImpl"></bean>
<bean id="userDao4Oracle" class="com.danny.spring.dao.UserDao4OracleImpl"></bean>
<bean id="userManager" class="com.danny.spring.manager.UserManagerImpl">
  <property name="userDao" ref="userDao4MySql"/>
</bean> 


3、静态工厂注入


  当我们通过静态工厂来获取Dao的实例时,比如再添加一个UserDaoFactory


public class UserDaoFactory {
  //生产UserDao4MySqlImpl实例
  public static final UserDao4MySqlImpl getUserDao4MySqlImpl(){
    return new UserDao4MySqlImpl();
  }
  //生产UserDao4OracleImpl实例
  public static final UserDao4OracleImpl getUserDao4OracleImpl(){
    return new UserDao4OracleImpl();
  }
}


  UserManagerImpl中的代码还跟Setter注入的代码一样:


public class UserManagerImpl implements UserManager{
  private UserDao userDao;
  //setter注入
  public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
  }
  @Override
  public void addUser(String username, String password) {
    userDao.addUser(username,password);
  }
}


  但是配置文件不一样:


<bean id="userDao4MySql" class="com.danny.spring.dao.UserDaoFactory" factory-method="getUserDao4MySqlImpl"/>
<bean id="userDao4Oracle" class="com.danny.spring.dao.UserDaoFactory" factory-method="getUserDao4OracleImpl"/>
<bean id="userManager" class="com.danny.spring.manager.UserManagerImpl">
    <property name="userDao" ref="userDao4MySql"/>
</bean> 

 上面配置文件中,userManager的注入的参数仍然是userDao,ref是userDao4MySql或userDao4Oracle,userDao4MySql和userDao4Oracle,他们的的class不再指向自己,而是指向生产他们的静态工厂,factory-method则是生产他们的方法。


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
67 26
|
2月前
|
XML Java 数据格式
【SpringFramework】Spring IoC-基于XML的实现
本文主要讲解SpringFramework中IoC和DI相关概念,及基于XML的实现方式。
113 69
|
2月前
|
Java Spring 容器
【SpringFramework】Spring IoC-基于注解的实现
本文主要记录基于Spring注解实现IoC容器和DI相关知识。
57 21
|
2月前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
2月前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
|
2月前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
285 78
|
30天前
|
Ubuntu NoSQL Linux
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
131 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
|
2月前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
2月前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
89 5
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
2月前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
158 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档