Spring IOC推导与DI构造器注入超详细讲解

目录
  • 了解准备
  • IOC思想
  • IOC本质
  • XML配置Spring
  • IOC创建对象方式

了解准备

什么是Spring?

Spring是一款轻量级的控制反转(IOC)和面向切面编程(AOP)的非入侵式开源框架

  • 2002年Spring的前身interface21发布,随后在2004年3月24日正式更名发布Spring1.0版本
  • Spring Frameword缔造者 Rod Johnson,悉尼大学音乐学博士生

Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC

Spring三大核心:IOC控制反转、DI依赖注入、AOP面向切面编程

Spring整合了现有的技术框架,使这些技术更加易于使用

Spring官网:https://spring.io/

下载地址:https://repo.spring.io/ui/native/release/org/springframework/spring

GitHub地址:https://github.com/spring-projects/spring-framework

maven依赖:

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.3.18</version>
</dependency>

整合MyBatis时导入

<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.23</version>
</dependency>

IOC思想

引入IOC

准备Dao层接口和一堆实现类

public interface UserDao {
    void getUser();
}
public class UserDaoImpl implements UserDao{
    public void getUser() {
        System.out.println("UserDao获取User成功!");
    }
}
public class UserDaoMySqlImpl implements UserDao{
    public void getUser() {
        System.out.println("UserDaoMySqlImpl获取User成功!");
    }
}
public class UserDaoOracleImpl implements UserDao{
    public void getUser() {
        System.out.println("UserDaoOracleImpl获取User成功!");
    }
}

准备业务层

public interface UserService {
    void getUser();
}
public class UserServiceImpl implements UserService{
  private UserDao userDao = new UserDaoImpl;
  public void getUser() {
    userDao.getUser();
  }
}

测试不同UserDao实现类的getUser方法

public class MyTest {
  @Test
  public void testGetUser(){
    UserServiceImpl service = new UserServiceImpl();
    service.getUser();
  }
}

可以发现,当需要调用不同UserDao实现类时,每次都需要区service中修改UserDao实例的指向

private UserDao userDao = new UserDaoImpl;
private UserDao userDao = new UserDaoOracleImpl;
private UserDao userDao = new UserDaoMySqlImpl;

这样设计的耦合性极高,对程序执行的控制权始终在开发人员手中,当用户提出不同需求就需要我们不断去修改UserDao实例的指向。如果代码数量大,那么需要修改的就不止一处,下面在service中注入set方法来动态的获取不同的UserDao实例指向

service:

public class UserServiceImpl implements UserService{
  private UserDao userDao;
  // 注入set方法  解耦
  public void setUserDao(UserDao userDao){
    this.userDao = userDao;
  }
  public void getUser() {
    userDao.getUser();
  }
}

Test:

public class MyTest {
  @Test
  public void testGetUser(){
    UserServiceImpl service = new UserServiceImpl();
    service.setUserDao(new UserDaoOracleImpl());
    service.getUser();
  }
}

上述示例,就可以动态的去选择执行用户指定的方法。此处的Test可以看作是一个servlet,它获取到用户的请求之后解析出对应执行的方法,再通过service去调用执行,耦合性就降低许多即用户需求和程序之间的耦合性降低,程序执行的控制权交给用户。以此完成控制反转IOC

IOC本质

IOC的本质就是一种控制反转的设计思想,它不完全等同于DI,DI(依赖注入)可以理解为实现IOC的一种方式。

那我的理解其实是,不能说控制权交给了用户,只是我们通过程序编写可以实现对用户需求的解析。解析出用户的需求对应程序中所要执行的方法即可。不能理解为控制权,只能说用户具有了主动权,并且在代码层面我们提高了程序的动态特性。

所谓控制反转,就是说获取对象的不再由程序的硬编码决定,而是反转到了用户手中。首先程序会解析出用户需求,再动态的获取相应对象

XML配置Spring

以上述UserDao示例配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans                         https://www.springframework.org/schema/beans/spring-beans.xsd">
  <!-- 将每一个UserDao的实现类映射到Spring容器中的bean -->
  <bean id="mysqlImpl" class="com.mountain.dao.MySqlImpl"/>
  <bean id="oracleImpl" class="com.mountain.dao.OracleImpl"/>
  <bean id="userService" class="com.mountain.service.UserServiceImpl">
    <property name="userDao" ref="mysqlImpl"/>
  </bean>
</beans>

测试;

@Test
public void testGetUser(){
  // 获取spring上下文对象
  ApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");
  UserServiceImpl service = (UserServiceImpl) context.getBean("userService");
  System.out.println(service.getUser());
}

可以看到,创建对象不需要再利用new关键字硬编码,而是完全交给Spring容器进行创建,我们在xml配置中将每一个UserDao的实现类映射到Bean,最后测试利用Spring上下文对象来获取映射好的bean实例

配置细节:

  • property标签name对应类中的字段,value是可以自定义的具体值,ref则是将该字段映射到具体某一个类上比如引用数据类型就会用到ref配置
  • bean中的id要与最终用Spring上下文对象getBean获取实例时的参数一致

IOC体现:

  • 对象的创建、管理全部交给Spring容器。主动权交给Spring
  • 程序不在主动的创建对象,而是被动的接收对象
  • 利用set方法注入

IOC创建对象方式

默认创建对象方式:

// 无参构造
public User() {
  System.out.println("默认使用无参构造");
}
// 测试
ApplicationContext context = new ClassPathXmlApplicationContext("application-Context.xml");
User user = (User) context.getBean("User");

最终打印:默认使用无参构造,所以在不进行任何其他配置的情况下,Spring默认创建bean依然走无参构造器

public User(String name) {}
<bean id="User" class="com.yuqu.pojo.User">
  <property name="name" value="情人节"/>
</bean>

如果我们只显式了有参构造,那么无参构造被覆盖之后将会导致application-Context.xml文件配置的bean编译直接报错

使用含参构造时

方式一:

<!--  方式一:index代表构造器参数索引  -->
<bean id="User" class="com.yuqu.pojo.User">
  <constructor-arg index="0" value="情人节"/>
</bean>

方式二:

<!--  方式二:type代表参数类型  基本数据类型用  弊端较大  -->
<bean id="User" class="com.yuqu.pojo.User">
 <constructor-arg type="java.lang.String" value="圣诞节"/>
</bean>

但是假设多个参数都是java.lang.String那么方式二就是不可取的

方式三:

<!--  方式三:直接通过参数名设置  -->
<bean id="User" class="com.yuqu.pojo.User">
  <constructor-arg name="name" value="国庆节"/>
</bean>

到此这篇关于Spring IOC推导与DI构造器注入超详细讲解的文章就介绍到这了,更多相关Spring IOC推导与DI构造器注入内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring框架中IoC容器与DI依赖注入教程

    目录 一.Spring 是什么 1.1 什么是容器 1.2 什么是 IoC 二.理解 IoC 2.1 传统程序开发的问题 2.2 分析 2.3 控制反转式程序开发 2.4 对比总结规律 2.5 理解 Spring IoC 三.DI 概念说明 四.总结 一.Spring 是什么 我们通常所说的 Spring 指的是 Spring Framework (Spring 框架),它是⼀个开源框架,有着活跃而庞大的社区,这就是它之所以能长久不衰的原因.Spring ⽀持⼴泛的应⽤场景,它可以让 Java

  • 新手了解java IO基础知识(二)

    目录 一.IO概念 1.什么是输入 2.什么输出(Output) 二.流的分类 1.InputStream(字节流) 2.OutputStream(字节流) 3.Reader(字符流) 4.Writer(字符流) 三.总结(1+2) 1. File类及方法的使用 2.IO流的分类 3.IO流的四个基本类 总结 一.IO概念 I/O 即输入Input/ 输出Output的缩写,其实就是计算机调度把各个存储中(包括内存和外部存储)的数据写入写出 java中用"流(stream)"来抽象表示

  • Spring IOC与DI核心深入理解

    目录 深入理解IOC思想 DI&IOC 深入理解IOC思想 spring本质就在于将对象全部交由给spring容器创建和管理,由容器控制对象的整个生命周期.核心就是IOC控制反转和AOP面向切面编程 先说IOC IOC是一种设计思想,叫做控制反转.本质就是通过Spring来负责对象的生命周期以及对象间的关系.在面向对象的开发过程中,我们程序中的各个对象往往会存在各种各样的依赖关系,因此耦合度极高,一旦修改其中一个类信息就会牵扯到很多相关类需要修改.那么为了降低这种耦合度IOC指出引用第三方容器,

  • Spring IOC推导与DI构造器注入超详细讲解

    目录 了解准备 IOC思想 IOC本质 XML配置Spring IOC创建对象方式 了解准备 什么是Spring? Spring是一款轻量级的控制反转(IOC)和面向切面编程(AOP)的非入侵式开源框架 2002年Spring的前身interface21发布,随后在2004年3月24日正式更名发布Spring1.0版本 Spring Frameword缔造者 Rod Johnson,悉尼大学音乐学博士生 Spring框架主要由七部分组成,分别是 Spring Core. Spring AOP.

  • Spring超详细讲解IOC与解耦合

    目录 前言 一.所谓耦合 二.Spring 三.核心IOC理解 1.容器 2.控制反转 3.依赖注入 四.Bean的实例化 1.无参构造 2.工厂静态方法 3.工厂实例方法(常用) 五.Bean的依赖注入 1.set注入 2.有参构造 六.第一个Spring案例 前言 回想写过的图书管理系统.租房系统.电影院卖票系统都是基于原生的JavaSE.OOP,没有用到任何框架,在层与层的关系中一个类要想获得与其他类的联系主要的方式还是靠new,这就导致层与层之间.对象与对象之间的依赖性强“动一发而迁全身

  • spring IOC中三种依赖注入方式

    一.Spring IOC(依赖注入的三种方式): 1.Setter方法注入. 2.构造方法注入. 使用构造方法,注入bean值. 关键代码: public UserServiceImpl(UserDao dao) { this.dao=dao; } <bean id="service" class="service.impl.UserServiceImpl"> <constructor-arg><ref bean="dao&q

  • Spring IOC容器Bean管理XML注入集合类型属性

    目录 一.定义数组.list.map.set类型属性 二.配置文件中进行对应配置 三.注入对象集合类型 四.提取注入集合的部分 1. 引入名称空间 util 2. 使用 util 标签完成集合注入的提取 一.定义数组.list.map.set类型属性 创建类.定义数组.list.map.set类型属性,生成对应set方法. package com.pingguo.spring5.collectiontype; import java.util.Arrays; import java.util.L

  • Java 超详细讲解核心类Spring JdbcTemplate

    目录 JdbcTemplate概述 JdbcTemplate开发步骤 JdbcTemplate快速入门 Spring产生JdbcTemplate对象 JdbcTemplate的常用操作 修改操作 删除和查询全部操作 查询单个数据操作 本章小结 JdbcTemplate概述 它是spring框架中提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装.spring框架为我们提供了很多的操作 模板类.例如:操作关系型数据的JdbcTemplate和HibernateTemplate,操作nos

  • Spring超详细讲解创建BeanDefinition流程

    目录 一.前期准备 1.1 环境依赖 1.2 实体类 1.3 applicationContext.xml 1.4 测试代码 二.探究过程 2.1 目标 2.2 BeanDefinition的创建过程 2.2.1 回顾bean对象的创建 2.2.2 AbstractApplicationContext 2.2.3 AbstractXmlApplicationContext 2.2.4 AbstractBeanDefinitionReader 2.2.5 XmlBeanDefinitionRead

  • Spring Boot超详细讲解请求处理流程机制

    目录 1. 背景 2. Spring Boot 的请求处理流程设计 3. Servlet服务模式请求流程分析 3.1 ServletWebServerApplicationContext分析 3.2 Servlet服务模式之请求流程具体分析 4. Reactive服务模式请求流程分析 4.1 ReactiveWebServerApplicationContext分析 4.2 webflux服务模式之请求流程具体分析 5. 总结 1. 背景 之前我们对Spring Boot做了研究讲解,我们知道怎

  • Spring超详细讲解注解开发

    目录 1.使用注解开发 1.1.Bean的实现 1.2.属性注入 1.3.衍生注解 1.4.自动装配注解 1.5.作用域 1.6.小结 2.基于Java类进行配置 1.使用注解开发 说明 在spring4之后,想要使用注解形式,必须得要引入aop的包 在配置文件当中,还得要引入一个context约束 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.spring

  • Java 超详细讲解Spring MVC异常处理机制

    目录 异常处理机制流程图 异常处理的两种方式 简单异常处理器SimpleMappingExceptionResolver 自定义异常处理步骤 本章小结 异常处理机制流程图 系统中异常包括两类: 预期异常 通过捕获异常从而获取异常信息. 运行时异常RuntimeException 主要通过规范代码开发.测试等手段减少运行时异常的发生. 系统的Dao.Service.Controller出现都通过throws Exception向上抛出,最后SpringMVC前端控制器交由异常处理器进行异常处理,如

随机推荐