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


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6天前
|
Java 测试技术 开发者
IoC容器有什么作用?
【4月更文挑战第30天】IoC容器有什么作用?
40 0
|
6天前
|
XML Java 数据格式
Spring框架入门:IoC与DI
【5月更文挑战第15天】本文介绍了Spring框架的核心特性——IoC(控制反转)和DI(依赖注入)。IoC通过将对象的创建和依赖关系管理交给容器,实现解耦。DI作为IoC的实现方式,允许外部注入依赖对象。文章讨论了过度依赖容器、配置复杂度等常见问题,并提出通过合理划分配置、使用注解简化管理等解决策略。同时,提醒开发者注意过度依赖注入和循环依赖,建议适度使用构造器注入和避免循环引用。通过代码示例展示了注解实现DI和配置类的使用。掌握IoC和DI能提升应用的灵活性和可维护性,实践中的反思和优化至关重要。
23 4
|
6天前
|
Java 测试技术 开发者
Spring IoC容器通过依赖注入机制实现控制反转
【4月更文挑战第30天】Spring IoC容器通过依赖注入机制实现控制反转
22 0
|
6天前
|
XML Java 程序员
Spring特性之二——IOC控制反转
Spring特性之二——IOC控制反转
16 4
|
6天前
|
安全 Java 开发者
在Spring框架中,IoC和AOP是如何实现的?
【4月更文挑战第30天】在Spring框架中,IoC和AOP是如何实现的?
24 0
|
6天前
|
Java 开发者 容器
IoC容器如何实现依赖注入?
【4月更文挑战第30天】IoC容器如何实现依赖注入?
21 0
|
6天前
|
XML Java 数据格式
如何配置IoC容器?
【4月更文挑战第30天】如何配置IoC容器?
20 0
|
6天前
|
安全 Linux Shell
Linux SSH(Secure Shell)服务
Linux SSH提供安全网络协议,使用公钥加密技术确保远程服务传输安全。OpenSSH是实现SSH服务的免费开源工具,允许用户加密连接远程登录Linux服务器执行任务。SSH比Telnet更安全,防止数据被截获。SSH还支持端口转发和隧道,广泛应用于系统管理和网络维护,是安全远程访问服务器的重要工具。
28 1
|
6天前
|
安全 Shell Linux
【Shell 命令集合 文件管理】Linux ssh 远程主机之间复制文件 scp 命令使用教程
【Shell 命令集合 文件管理】Linux ssh 远程主机之间复制文件 scp 命令使用教程
47 0
|
6天前
|
Linux 网络安全 数据安全/隐私保护
SSH工具连接远程服务器或者本地Linux系统
SSH工具连接远程服务器或者本地Linux系统
25 0