Spring_01 spring容器、控制反转(IOC)、依赖注入(DI)
目录
1 什么是spring框架
2 spring框架的特点
3 spring容器
3.1 什么是spring容器
3.4 spring容器创建对象的方式
3.5 bean元素的几个重要属性
4 IOC
4.1 什么是IOC
4.2 什么事DI
4.3 DI的三种方式
1 什么是spring框架
是一个开源的用来简化企业级应用开发的框架
2 spring框架的特点
2.1 简化开发
spring对一些常见的api(比如jdbc)做了封装,使用这些封装之后的api,代码会大大简化。
比如,使用springjdbc来访问数据库,就不用考虑如何获取连接,关闭连接等操作。
2.2 管理对象
spring可以帮我们管理对象之间的依赖关系,这样一来, 软件更容易维护。
2.3 集成其它框架
spring可以将一些框架集成进来,更方便使用这些框架。、
比如,可以利用spring集成mybatis(mybatis是一个用 来访问数据库的框架),这样mybatis用起来更加简单。
3 spring容器
3.1 什么是spring容器
是spring框架当中的一个核心模块,用来管理对象。
3.2怎么利用 spring容器 来创建对象
3.2.1 创建一个 maven项目
》记得让maven项目中出现 web.xml 这个配置文件 -->> 还记得咋整吗?
3.2.2 导包
spring-webmvc -->> 启动 spring容器 时需要用到
junit -->> 进行单元测试时需要用到
3.2.3 启动 spring容器
》添加一个 spring容器 配置文件
例:给Student类配置bean,只需在spring的配置文件中添加
<bean id="stu" class="test.Student"></bean>
id : 必须要保证唯一
class:就是需要配置bean的类名,但是必须在前面加上 包名.
》利用 ApplicationContext 的实现类 ClassPathXmlApplicationContext 去启动容器
3.2.4 利用 getBean(String name, Class<T> requiredType) 来实例化对象
注意:spring容器会利用相关类的无参构造器去创建实例,所以相关类中必须要有无参构造器,否则会报错:“找不到无参构造器”
3.3 注意
spring容器一旦启动,就会在 堆 中将所有配置了 bean 的类创建好一个实例
package test;
import java.io.Serializable;
public class Student implements Serializable {
private Integer id;
private String name;
private String gender;
public Student() {
super();
System.out.println("New Student()");
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String toString() {
return "Student [id=" + id + ", name=" + name + ", gender=" + gender + "]";
}
}
Student类
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd"> <bean id="stu" class="test.Student"></bean> </beans>
test.xml配置文件
package test; import java.io.Serializable; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test implements Serializable {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("test.xml");
System.out.println(ac); Student stu1 = ac.getBean("stu", Student.class);
System.out.println(stu1);
}
}
Test类

3.4spring容器 实例化对象的三种方法
3.4.1 利用无参构造器实现(很重要)
必须有无参构造器,如果已经添加了有参构造器,那么默认的无参构造器就会被覆盖;此时就需要手动添加一个无参构造器
3.4.2 利用静态工厂方法实现(了解)
3.4.3 利用实例化工厂方法实现(了解)
3.5 bean元素的几个重要属性
3.5.1 作用域
scope 属性 : 用来指定作用域
缺省值是 singleton(单例),如果值是prototype(原型),则可以创建多个对象,否则不可以
我们一般使用 单例模式 就可以啦(即:默认值)
3.5.2 生命周期
初始化
init-method属性:指定初始化方法
销毁
destroy-method属性:指定销毁方法
只有作用域为单例的 bean, 销毁方法才有效
必须使用这个spring容器接口:AbstractApplicationContext
3.5.3 延迟加载
默认情况下当 spring容器 启动之后,会将所有作用域为单例的 bean 都创建好
lazy-init属性:指定是否延迟加载,值为 true 时延迟加载(一般不用延迟加载)
4 IOC(Inversion Of Controll 控制反转)
4.1 什么事IOC
对象之间的依赖关系交给容器来管理。
4.2 什么是DI (Dependency Injection 依赖注入)
容器通过调用set方法或者构造器来建立对象之间的依赖关系
注:IOC是目标,而DI是手段

4.3DI 注入的两种方式
4.3.1 利用 set 方法完成依赖注入(掌握)
注入类中必须有一个成员变量,该成员变量的类型必须是被依赖注入的类
注入类中必须实现需要注入的那个成员变量的 set 方法
set 方法进行依赖注入时,在配置文件中用到的是 property标签;如果需要注入的类中有有参构造器,那么必须实现无参构造器,因为有参构造器会覆盖无参构造器(注意:菜鸟一般吧无参构造器和有参构造器都实现)
注意:注入类中那个成员变量的类型 一般都设定为被注入类的一个接口,这样有利于今后进行维护
利用 property标签实现依赖注入
<property name="stu" ref="student01"></property>
name:需要依赖注入的成员变量
ref:需要依赖注入类的id属性值

图解:创建A的实例,而且B是注入到A中的;B类中必须实现无参构造器,A中必须添加一个类型为B的成员变量,而且还必须为该成员变量实现set方法,在spring配置文件中配置A和B的bean,而且在A的bean中还要利用property标签来实现B的依赖注入
4.3.2 利用有参构造器完成依赖注入(掌握)
这里的构造器是有参构造器,但是它的参数这是你需要注入的参数名,不包含其他的
利用constructor-arg标签实现依赖注入
<constructor-arg index="0" ref="b1"/>
index:有参构造器中参数的位置,从0开始
ref:依赖注入类的id属性值

图解:创建A的实例,而且B是注入到A中的;B类中必须实现无参构造器,A中必须添加一个类型为B的成员变量;为A添加一个有参构造器,而且该有参构造器的参数只是你要注入的那个成员变量,不包含其他的;而且该有参构造器任然会覆盖无参构造器,所以如果想要使用无参构造器就必须先实现无参构造器;在spring的配置文件中配置A和B的bean,而且还需要用constructor-arg标签实现B的依赖注入
4.3.3 自动装配(一般不用)
注意:依赖注入一般都由注释实现
源代码链接:点击前往
Spring_01 spring容器、控制反转(IOC)、依赖注入(DI)的更多相关文章
- spring(3)------控制反转(IOC)/依赖注入(DI)
一.spring核心概念理解 控制反转: 控制反转即IoC (Inversion of Control).它把传统上由程序代码直接操控的对象的调用权交给容器.通过容器来实现对象组件的装配和管理. 所谓 ...
- Spring 之 控制反转(IoC), 依赖注入(DI)和面向切面(AOP)
关于依赖注入, 这篇博文写的非常简单易懂. https://github.com/android-cn/blog/tree/master/java/dependency-injection 此外, 博 ...
- 依赖倒置原则DIP&控制反转IOC&依赖注入DI
依赖倒置原则DIP是软件设计里一个重要的设计思想,它规定上层不依赖下层而是共同依赖抽象接口,通常可以是上层提供接口,然后下层实现接口,上下层之间通过接口完全透明交互.这样的好处,上层不会因依赖的下层修 ...
- 简单了解Spring的控制反转和依赖注入
浅谈控制反转(Inversion of Control,IOC) 我们首先先来了解一下控制二字,也就是在控制"正"转的情况下,在任何一个有请求作用的系统当中,至少需要有两个类互相配 ...
- Spring的控制反转和依赖注入
Spring的官网:https://spring.io/ Struts与Hibernate可以做什么事? Struts, Mvc中控制层解决方案 可以进行请求数据自动封装.类型转换.文件上传.效验… ...
- Spring理论基础-控制反转和依赖注入
第一次了解到控制反转(Inversion of Control)这个概念,是在学习Spring框架的时候.IOC和AOP作为Spring的两大特征,自然是要去好好学学的.而依赖注入(Dependenc ...
- Spring、控制反转与依赖注入(概念)
Spring 一个开源的控制反转(Inversion of Control ,Ioc)和面向切面(AOP)的容器框架. 主要目的:简化开发 控制反转(Inversion of Control ,Ioc ...
- 如何通俗的理解spring的控制反转、依赖注入、面向切面编程等等
之前一直不理解spring的一些基础特性是什么意思,虽然网上的解释也很多,但是由于我比较笨,就是看不懂,知道最近才稍微了解,下面就以通俗讲解的方式记录下来. 前言 假设我是一个没有开店经验的小老板,准 ...
- Spring 1 控制反转、依赖注入
1.1 Spring的核心是控制反转(IoC)和面向切面(AOP) 学习spring之前的开发中通过new创建一个对象,有了spring之后,spring创建对象实例-IoC控制反转,之后需要实例对象 ...
- 【SSH】——spring的控制反转和依赖注入
spring是一个轻量级的容器框架,主要是为了使企业的开发变得简单.高效.无论是从大小还是开销来讲,他都可以算是轻量级的,也是非侵入性的. 下图是spring的框架示意图,说到spring,就不得不提 ...
随机推荐
- Ceph的现状
转自:https://www.ustack.com/blog/ceph-distributed-block-storage/ 1. Ceph简介 Ceph是统一分布式存储系统,具有优异的性能.可靠性. ...
- mac下编译安装grafana 4.2.0
go语言在开发效率和运行效率中的优势让很多人青睐,所以有倾向打算转向go语言的开发. 下面介绍在Mac OS X中golang的开发环境配置. 1.安装brew brew是一个mac下的由ruby开发 ...
- 延时并自动关闭MessageBox
信息提示框(MessageBox)是微软NET自带的一个用于弹出警告.错误或者讯息一类的“模式”对话框.此类对话框一旦开启,则后台窗体无法再被激活(除非当前的MessageBox被点击或者关闭取消). ...
- Magic Index 寻找数组中A[i]=i的位置(原题转自微信号待字闺中)
有一个有意思的题目叫做Magic Index:给定一个数组A,其中有一个位置被称为Magic Index,含义是:如果i是Magic Index,则A[i] = i.假设A中的元素递增有序.且不重复, ...
- svn的ignor也是要提交的
刚才一直奇怪为什么svn管理某个路径下总是报要提交,但是进入同步模式,看不到任何内容,就是告诉该文件夹要提交:后来才发现原来是我添加了一个该文件夹下的文件为svn:ignor,所以要提交以下.
- CF884D:Boxes And Balls
浅谈\(Huffman\)树:https://www.cnblogs.com/AKMer/p/10300870.html 题目传送门:https://codeforces.com/problemset ...
- 四、ABP 学习系列 - 配置Swagger
一.再XX.Web项目中用Nuget安装Swashbuckle.AspNetCore.SwaggerGen和Swashbuckle.AspNetCore.SwaggerUI 二.在Startup.cs ...
- 微服务监控之一:Metrics让微服务运行更透明
摘要 让微服务运行状态清晰可见. 嘉宾演讲视频回顾及PPT:http://t.cn/R8b6i85 Metrics是什么 直译是“度量”,不同的领域定义有所区别,在微服务领域中的定义: “对微服务的某 ...
- 用IntelliJ IDEA建maven项目,如何解决main下无法创建java源文件
一.缺少java源文件 如下图: 现在想要在main下面增加java源文件,效果图如下所示: 首先,在main目录下新建java文件夹,就是源文件目录, 然后,右键,选择Mark Directory ...
- 二 Istio设计的核心原则
Istio架构关键目标 最大化透明度:Istio将自身自动注入到服务间所有的网络路径中.Istio使用sidecar代理来捕获流量,并且在尽可能的地方自动编程网络层,通过代理来路由流量,无需改动应用程 ...