【Java从0到架构师】Spring - IoC 控制反转、DI 依赖注入
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 依赖注入相关推荐
- IOC控制反转(依赖注入思想)
IOC控制反转(依赖注入思想) 获取map 类型的 request session application 的方法: 实现RequestAware,SessionAware,ApplicationAw ...
- SSM框架—Spring基础—控制反转和依赖注入(概念)
控制反转: 控制反转(IoC)是面向对象编程的一个设计原则,用于降低代码耦合度 在传统面向对象编程中,获取对象的方式是用关键字"new"主动创建一个对象,也就是说,应用程序掌握着对 ...
- java json injection_Java Web实现IOC控制反转之依赖注入
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. 控制反转一般分为两种类型,依赖注入 ...
- Spring的控制反转与依赖注入
学习过Spring的都知道Spring有三大核心的概念,分别是控制反转(IOC).依赖注入(DI)和面向切面编程(AOP).今天就来聊聊我对控制反转和依赖注入的了解,至于面向切面编程放到后面讲解. 一 ...
- Spring中控制反转和依赖注入
Spring之IOC控制反转和DI依赖注入 1.控制反转是什么? IOC控制反转,所谓反转是指使用方本身不负责依赖对象的创建和维护,而将对象的管理(创建.维护.销毁)都交给Spring容器管理,在使用 ...
- spring的控制反转和依赖注入讲解
1.Spring 1.1 简介 2002年首次推出Spring的雏形,interface21框架 2004正式发布1.0版本 解决企业应用开发的复杂性,其理念是使现有的技术更加容易使用! SSH:St ...
- Spring的控制反转以及依赖注入,控制反转使程序具有高拓展性。
1. 控制反转(Inversion of Control, IOC) 将对象的创建.赋值.管理交给容器(Spring),通过xml文件即可修改对象的属性,不必修改源代码,具有高拓展性.各个模块间的对象 ...
- Spring 中控制反转 和 依赖注入 的区别和关系
控制反转 (IOC),面向对象的一种设计原则,目的是降低耦合度.依赖注入(DI)是实现控制反转的常见方式,控制反转的另外一种实现方式是 依赖查找.控制反转中的控制指的是自己控制(创建)自己的成员变量, ...
- spring ioc控制反转
一. 什么是spring,它能够做什么? Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的. Spring使用基本的JavaBean来完成以前只可能 ...
- Java之控制反转和依赖注入
1.简介 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性,下面通过一个例子来引入这一概念. 2.案例 1)一般情况下的类耦合 Main.java public clas ...
最新文章
- IBM收购Q1 Labs
- [BUUCTF-pwn]——axb_2019_brop64
- solaris 中挂载usb移动硬盘
- python微信跳一跳小游戏刷分
- 创意吃鱼法(洛谷-P1736)
- php post fsockopen,php_fsockopen_post
- 【Janino】Janino介绍
- 一次数据分析的全过程
- MHA高可用 MHA+Keepalive
- openwrt(路由器)的源码地址
- Uva 816 Abbott's Revenge 紫书165页例题
- Docker的镜像管理
- chrome浏览器调试时阻止图片的加载
- 计算机方向键是哪个键,你可能从来没碰过的键,电脑键盘方向键上面的3个按键有什么用?...
- php数据库查询到数据以表格的形式展现出来
- rundown of the Objective-C Type Encodings
- ubuntu 18.04 安装 搜狗拼音输入法只有中文标点,没有文字
- win10找不到gpedit.msc
- 实验吧之【让我进去】(哈希长度扩展攻击)
- Vue3 探坑之旅3
热门文章
- 一篇文章,可以同时拥有4份收益,你知道吗?
- 问你个问题:50万存款算多吗?
- 没有别家钱多,没有别家人多,小型培训机构招生怎么做?
- 如果量子计算机成功应用,这世界上还有普通人的生存空间吗?
- LL(1)分析表的构造
- sql服务器内存不足_SQL Server内存性能指标–第2部分–可用字节,总服务器和目标服务器内存
- 配置iscsi服务器_在Windows Server 2016上安装和配置iSCSI目标服务器
- 预编译sql查询语句_频繁的查询重新编译– SQL查询性能的杀手–简介
- C++ Template 使用简介
- Vue的v-if与v-show的区别