IoC 控制反转、DI 依赖注入

  • Spring 简介
  • Spring 基本使用 - IoC 容器
  • 依赖注入 (Dependency Injection)
    • 基于 setter 的注入 - 自定义对象 bean
    • 基于 setter 的注入 - 基本类型、String、BigDecimal
    • 基于 setter 的注入 - 数组、集合类型
    • 基于 setter 的注入 - properties
    • 基于 constructor 的注入 - 基本类型、String、BigDecimal
    • 基于 constructor 的注入 - 自定义对象 bean
    • 基于 constructor 的注入 - 集合类型

Java 从 0 到架构师目录:【Java从0到架构师】学习记录

学习 Spring 搭配这门课效果更好:《孙哥说Spring5》学习笔记

Gitee 代码:https://gitee.com/szluyu99/mj_java_frame/tree/master/02_Spring/

Spring 简介

Spring 框架是 Java 开发中最常用的框架,功能非常强大

  • https://spring.io/
  • https://spring.io/projects/spring-framework

官网标语: Spring makes Java simple、modern、productive …

Spring 框架的几个核心概念:

  • IoC:Inversion of Control,控制反转
  • DI:Dependency Injection,依赖注入
  • AOP:Aspect Oriented Programming,面向切面编程

本课程使用的版本是 5.2.8:

  • 核心参考文档
  • API 文档

Spring 下载:

Jar 包、文档下载:https://repo.spring.io/ui/

源码下载:https://github.com/spring-projects/spring-framework

Spring 基本使用 - IoC 容器

【Spring 工厂】工厂设计模式、第一个Spring程序细节分析、整合日志框架

添加 Maven 依赖:

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.8.RELEASE</version>
</dependency>

新建一个核心配置文件:applicationContext.xml

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="personDao" class="com.mj.dao.impl.PersonDaoImpl"/><bean id="personService" class="com.mj.service.impl.PersonServiceImpl"><property name="dao" ref="personDao"/></bean></beans>

创建 service 对象:

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
PersonService service = ctx.getBean("personService", PersonService.class);
service.save(new Person());

IoC 的一个很重要的作用:解耦,将对象创建的控制权转交给 Spring

耦合:我依赖你,你不见了(或者我不要你了),对我影响很大,我就得改代码。

  • 写代码的方向:解耦、降低耦合性 —> 工厂设计模式

Spring 可以轻松整合日志框架:logback

<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version>
</dependency>

依赖注入 (Dependency Injection)

【Spring 工厂】注入详解 — Set注入(JDK内置类型,用户自定义类型)、构造注入(重载)

常见的注入内容可以分为 3 大类:

  • bean(自定义类型)
  • 基本类型(8 种)、String、BigDecimal
  • 集合类型(数组、Map、List、Set、Properties)

常见的注入方式有 2 种:

  • 基于 setter(属性)
  • 基于 constructor(构造方法)

基于 setter 的注入 - 自定义对象 bean

以下 4 种写法是等价的:

1、先注入一个 personDao 对象,再将 personDao 注入到 personService 中:

<bean id="personDao" class="com.mj.dao.PersonDaoImpl" /><bean id="personService" class="com.mj.service.PersonServiceImpl"><property name="dao"><ref bean="personDao" /></property>
</bean>

2、上面的简写写法:

<bean id="personDao" class="com.mj.dao.PersonDaoImpl" /><bean id="personService" class="com.mj.service.PersonServiceImpl"><property name="dao" ref="personDao" />
</bean>

3、注入 personService 对象的同时,注入 dao 对象:

<bean id="personService" class="com.mj.service.PersonServiceImpl"><property name="dao"><bean class="com.mj.dao.PersonDaoImpl"/></property>
</bean>

先在根标签加一个命名空间属性:

 xmlns:p="http://www.springframework.org/schema/p"

4、使用命名空间 p 近一步简化写法:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:p="http://www.springframework.org/schema/p"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="personDao" class="com.mj.dao.PersonDaoImpl" /><bean id="personService" class="com.mj.service.PersonServiceImpl"p:dao-ref="personDao" />
</beans>

基于 setter 的注入 - 基本类型、String、BigDecimal

<bean id="personService" class="com.mj.service.PersonServiceImpl"><property name="amount" value="66.66" /><property name="age"><value>28</value></property>
</bean>

基于 setter 的注入 - 数组、集合类型

<!-- 数组 -->
<property name="nos"><array><value>11</value><value>22</value><value>33</value></array>
</property>
<!-- ArrayList -->
<property name="nos"><list><value>11</value><value>22</value><value>33</value></list>
</property>
<!-- LinkedHashMap -->
<property name="friends"><map><entry key="Jack" value="广州"><entry key="Rose" value="北京"><entry key="Larry" value="上海"></map>
</property>
<!-- LinkedHashSet-->
<property name="phones"><set><value>Java</value><value>Rose</value><value>James</value></set>
</property>

基于 setter 的注入 - properties

<!-- properties -->
<property name="hobbies"><props><prop key="football">足球</prop><prop key="baseball">棒球</prop><prop key="shopping">购物</prop></props>
</property>

基于 constructor 的注入 - 基本类型、String、BigDecimal

public Person(int age, String name) {this.age = age;this.name = name;
}

方法 1:指定了参数类型,顺序要和构造方法里参数顺序对应

<bean id="personService" class="com.mj.service.PersonServiceImpl"><!-- 顺序要和构造方法里参数顺序对应 --><constructor-arg type="int" value="22" /><constructor-arg type="java.lang.String" value="Jack" />
</bean>

方法 2:通过指定索引对应构造方法的参数

<bean id="personService" class="com.mj.service.PersonServiceImpl"><!-- 指定了构造方法里参数的索引 --><constructor-arg index="0" value="22" /><constructor-arg index="1" value="Jack" />
</bean>

方法 3 :在构造方法中需要使用 @ConstructorProperties 指定参数名

@ConstructorProperties({"age", "name"})
public Person(int age, String name) {this.age = age;this.name = name;
}
<bean id="personService"class="com.mj.service.PersonServiceImpl"><constructor-arg name="name" value="Jack" /><constructor-arg name="age" value="25" />
</bean>

基于 constructor 的注入 - 自定义对象 bean

以下 3 种写法等价:

<bean id="personDao" class="com.mj.dao.PersonDaoImpl" /><bean id="personService" class="com.mj.service.PersonServiceImpl"><constructor-arg><ref bean="personDao"/></constructor-arg>
</bean>
<bean id="personDao" class="com.mj.dao.PersonDaoImpl" /><bean id="personService" class="com.mj.service.PersonServiceImpl"><constructor-arg ref="personDao" />
</bean>
<bean id="personService" class="com.mj.service.PersonServiceImpl"><constructor-arg><bean class="com.mj.dao.PersonDaoImpl"/></constructor-arg>
</bean>

基于 constructor 的注入 - 集合类型

<bean id="personService" class="com.mj.service.PersonServiceImpl"><constructor-arg><list><value>Jack</value><value>Rose</value></list></constructor-arg>
</bean>

【Java从0到架构师】Spring - IoC 控制反转、DI 依赖注入相关推荐

  1. IOC控制反转(依赖注入思想)

    IOC控制反转(依赖注入思想) 获取map 类型的 request session application 的方法: 实现RequestAware,SessionAware,ApplicationAw ...

  2. SSM框架—Spring基础—控制反转和依赖注入(概念)

    控制反转: 控制反转(IoC)是面向对象编程的一个设计原则,用于降低代码耦合度 在传统面向对象编程中,获取对象的方式是用关键字"new"主动创建一个对象,也就是说,应用程序掌握着对 ...

  3. java json injection_Java Web实现IOC控制反转之依赖注入

    控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. 控制反转一般分为两种类型,依赖注入 ...

  4. Spring的控制反转与依赖注入

    学习过Spring的都知道Spring有三大核心的概念,分别是控制反转(IOC).依赖注入(DI)和面向切面编程(AOP).今天就来聊聊我对控制反转和依赖注入的了解,至于面向切面编程放到后面讲解. 一 ...

  5. Spring中控制反转和依赖注入

    Spring之IOC控制反转和DI依赖注入 1.控制反转是什么? IOC控制反转,所谓反转是指使用方本身不负责依赖对象的创建和维护,而将对象的管理(创建.维护.销毁)都交给Spring容器管理,在使用 ...

  6. spring的控制反转和依赖注入讲解

    1.Spring 1.1 简介 2002年首次推出Spring的雏形,interface21框架 2004正式发布1.0版本 解决企业应用开发的复杂性,其理念是使现有的技术更加容易使用! SSH:St ...

  7. Spring的控制反转以及依赖注入,控制反转使程序具有高拓展性。

    1. 控制反转(Inversion of Control, IOC) 将对象的创建.赋值.管理交给容器(Spring),通过xml文件即可修改对象的属性,不必修改源代码,具有高拓展性.各个模块间的对象 ...

  8. Spring 中控制反转 和 依赖注入 的区别和关系

    控制反转 (IOC),面向对象的一种设计原则,目的是降低耦合度.依赖注入(DI)是实现控制反转的常见方式,控制反转的另外一种实现方式是 依赖查找.控制反转中的控制指的是自己控制(创建)自己的成员变量, ...

  9. spring ioc控制反转

    一. 什么是spring,它能够做什么? Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的. Spring使用基本的JavaBean来完成以前只可能 ...

  10. Java之控制反转和依赖注入

    1.简介 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性,下面通过一个例子来引入这一概念. 2.案例 1)一般情况下的类耦合 Main.java public clas ...

最新文章

  1. IBM收购Q1 Labs
  2. [BUUCTF-pwn]——axb_2019_brop64
  3. solaris 中挂载usb移动硬盘
  4. python微信跳一跳小游戏刷分
  5. 创意吃鱼法(洛谷-P1736)
  6. php post fsockopen,php_fsockopen_post
  7. 【Janino】Janino介绍
  8. 一次数据分析的全过程
  9. MHA高可用 MHA+Keepalive
  10. openwrt(路由器)的源码地址
  11. Uva 816 Abbott's Revenge 紫书165页例题
  12. Docker的镜像管理
  13. chrome浏览器调试时阻止图片的加载
  14. 计算机方向键是哪个键,你可能从来没碰过的键,电脑键盘方向键上面的3个按键有什么用?...
  15. php数据库查询到数据以表格的形式展现出来
  16. rundown of the Objective-C Type Encodings
  17. ubuntu 18.04 安装 搜狗拼音输入法只有中文标点,没有文字
  18. win10找不到gpedit.msc
  19. 实验吧之【让我进去】(哈希长度扩展攻击)
  20. Vue3 探坑之旅3

热门文章

  1. 一篇文章,可以同时拥有4份收益,你知道吗?
  2. 问你个问题:50万存款算多吗?
  3. 没有别家钱多,没有别家人多,小型培训机构招生怎么做?
  4. 如果量子计算机成功应用,这世界上还有普通人的生存空间吗?
  5. LL(1)分析表的构造
  6. sql服务器内存不足_SQL Server内存性能指标–第2部分–可用字节,总服务器和目标服务器内存
  7. 配置iscsi服务器_在Windows Server 2016上安装和配置iSCSI目标服务器
  8. 预编译sql查询语句_频繁的查询重新编译– SQL查询性能的杀手–简介
  9. C++ Template 使用简介
  10. Vue的v-if与v-show的区别