【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则是生产他们的方法。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
1月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
5月前
|
XML 人工智能 Java
Spring IOC 到底是什么?
IOC(控制反转)是一种设计思想,主要用于解耦代码,简化依赖管理。其核心是将对象的创建和管理交给容器处理,而非由程序直接硬编码实现。通过IOC,开发者无需手动new对象,而是由框架负责实例化、装配和管理依赖对象。常见应用如Spring框架中的BeanFactory和ApplicationContext,它们实现了依赖注入和动态管理功能,提升了代码的灵活性与可维护性。
191 1
|
XML Java 数据格式
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
|
6月前
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
|
8月前
|
Java 容器 Spring
什么是Spring IOC 和DI ?
IOC : 控制翻转 , 它把传统上由程序代码直接操控的对象的调用权交给容 器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转 移,从程序代码本身转移到了外部容器。 DI : 依赖注入,在我们创建对象的过程中,把对象依赖的属性注入到我们的类中。
|
1月前
|
Linux 网络安全 Docker
盘古栈云,创建带ssh服务的linux容器
创建带ssh服务的linux容器
271 146
|
4月前
|
监控 Linux 网络安全
FinalShell SSH工具下载,服务器管理,远程桌面加速软件,支持Windows,macOS,Linux
FinalShell是一款国人开发的多平台SSH客户端工具,支持Windows、Mac OS X和Linux系统。它提供一体化服务器管理功能,支持shell和sftp同屏显示,命令自动提示,操作便捷。软件还具备加速功能,提升访问服务器速度,适合普通用户和专业人士使用。
1234 0
|
7月前
|
安全 Linux 网络安全
在Linux(CentOS和AWS)上安装更新的git2的方法并配置github-ssh
经过以上这些步骤,你现在就能在GitHub上顺利往返,如同海洋中的航海者自由驰骋。欢迎你加入码农的世界,享受这编程的乐趣吧!
319 10
|
安全 Linux Shell
Linux中SSH命令介绍
Linux中SSH命令介绍
585 2
|
监控 Ubuntu Linux
使用VSCode通过SSH远程登录阿里云Linux服务器异常崩溃
通过 VSCode 的 Remote - SSH 插件远程连接阿里云 Ubuntu 22 服务器时,会因高 CPU 使用率导致连接断开。经排查发现,VSCode 连接根目录 ".." 时会频繁调用"rg"(ripgrep)进行文件搜索,导致 CPU 负载过高。解决方法是将连接目录改为"root"(或其他具体的路径),避免不必要的文件检索,从而恢复正常连接。
下一篇
oss云网关配置