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

简介:   **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;
相关文章
|
7月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
7月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
705 2
|
11月前
|
XML 人工智能 Java
Spring IOC 到底是什么?
IOC(控制反转)是一种设计思想,主要用于解耦代码,简化依赖管理。其核心是将对象的创建和管理交给容器处理,而非由程序直接硬编码实现。通过IOC,开发者无需手动new对象,而是由框架负责实例化、装配和管理依赖对象。常见应用如Spring框架中的BeanFactory和ApplicationContext,它们实现了依赖注入和动态管理功能,提升了代码的灵活性与可维护性。
261 1
|
XML Java 数据格式
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
|
9月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1229 108
|
10月前
|
存储 监控 测试技术
如何将现有的应用程序迁移到Docker容器中?
如何将现有的应用程序迁移到Docker容器中?
714 57
|
7月前
|
监控 Kubernetes 安全
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
蒋星熠Jaxonic,技术探索者,以代码为笔,在二进制星河中书写极客诗篇。专注Docker与容器化实践,分享从入门到企业级应用的深度经验,助力开发者乘风破浪,驶向云原生新世界。
754 51
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !