Spring(Spring的理解+DI+Spring的创建)
目录
1. Spring 是什么
2. DI
3. 面试题: IoC 和 DI 有什么区别?
4. Spring 的创建
5. 将 Bean (对象) 存储到 Spring (容器) 中
6. 将 Bean (对象) 从 Spring (容器) 中取出来
7. 面试题: ApplicationContext 和 BeanFactory的区别
8. getBean 更多用法
1. Spring 是什么
通常所说的 Spring 是 Spring Framework (Spring 框架),
用一句话来解释 Spring: Spring 是包含了众多工具方法的 IoC 容器
那么什么是 IoC 容器?
先来理解看一下什么是容器: 容器是用来容纳某种物品的 (基本) 装置
对比到前面的知识点, 目前接触到的容器有
- List / Map --> 数据存储容器
- Tomcat --> Web 容器
Spring 也是一个容器, Spring 是一个 IoC 容器
下面再看一下什么是 IoC ?
IoC = Inversion of Control 翻译过来就是 "控制反转" 的意思, 也就是
Spring 是一个 "控制反转" 的容器,
("控制反转":之前的控制权是在我身上,现在反转了,也就是我把控制权交出去了,交给框架了,下次我再要用X的时候,直接告诉框架,我要用X,而现在的X的生命周期和我没啥关系)
IoC 优点: 实现代码的解耦; 对象 (Bean) 生命周期交给 IoC 框架来维护,作为程序员无需再关注了
Spring IoC 容器最核心的功能:
- 将 Bean (对象) 存储到 Spring (容器) 中
- 将 Bean (对象) 从 Spring (容器) 中取出来
Spring 是一个 IoC 容器, 说的是对象的创建和销毁的权利都交给 Spring 来管理了, 它本身又具备了存储对象和获取对象的能力.
2. DI
说到IoC 就要提到 "DI", DI 是 Dependency Injection 的缩写,翻译过来就是 "依赖注入" 的意思
依赖:比如说A类中,需要用到B类,那就说A依赖B
注入:将一个东西拿过来用就叫做注入
合起来"依赖注入"的意思就是: 有 IoC 容器在运行期间,动态的将某种依赖关系注入到对象中.
依赖注入的角度就是,通过引用 IoC 容器,利用依赖关系注入的方式,实现对象之间的解耦,所以DI 是一种实现
3. 面试题: IoC 和 DI 有什么区别?
IoC 是一种思想: 控制反转
DI 是一种实现: 依赖注入
4. Spring 的创建
(1) 创建一个 maven 项目
输入项目名就可以了
(2) 添加 spring 框架支持(spring-context/spring-beans)
先配置镜像国内源
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
然后再添加Spring框架支持
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.3.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.3.RELEASE</version></dependency></dependencies>
(3) 创建一个启动类并添加 main
5. 将 Bean (对象) 存储到 Spring (容器) 中
存储 Bean 对象三步(两步)走
- 如果是第一次添加, 先在 spring 项目中添加配置文件
- 先创建一个 Bean 对象
- 在配置文件中将需要保存到 spring 中的 Bean 对象进行注册
(1) 在 spring 项目中添加配置文件
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
(2) 创建一个 Bean 对象
(3) 在配置文件中将需要保存到 spring 中的 Bean 对象进行注册
id可以不等于 class 里面的类名,但是要尽量符合规范
类名使用大驼峰, bean id 通常使用小驼峰.
假设类名是 UserInfo, 那么通常情况下 id 它应该是 userInfo
6. 将 Bean (对象) 从 Spring (容器) 中取出来
- 先得到 spring 上下文对象(ApplicationContext / BeanFactory)
- 再通过上下文对象提供的方法,获取需要使用的 bean 对象
- 可以使用 bean 对象
import com.beans.UserBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class app {public static void main(String[] args) {// 1. 得到 spring 上下文对象ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");// 2. 根据上下文对象提供的方法,获取需要使用的 bean 对象UserBean userBean = (UserBean) context.getBean("user");// 3. 可以使用 bean 对象userBean.sayHi("张三");}
}
import com.beans.UserBean;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;public class app {public static void main(String[] args) {// 1. 得到 spring 上下文对象BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));// 2. 根据上下文对象提供的方法,获取需要使用的 bean 对象UserBean userBean = (UserBean) beanFactory.getBean("user");// 3. 可以使用 bean 对象userBean.sayHi("张三");}
}
package com.beans;
//普通的 bean 对象
public class UserBean {public void sayHi(String name) {System.out.println("你好:" + name);}
}
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 将一个对象存储到容器中 --><bean id="user" class="com.beans.UserBean"></bean>
</beans>
7. 面试题: ApplicationContext 和 BeanFactory的区别
相同点: ApplicationContext 和 BeanFactory 效果是⼀样的, 都可以实现从容器中获取 bean,都提供了 getBean 的方法.
不同点:
从继承关系和功能方面来看: BeanFactory 提供了基础的访问容器的能力,
而 Application 属于 BeanFactory 的子类,它除了继承了 BeanFactory 的所有功能外,它还拥有独特的特性,还添加了对国际化支持,资源访问支持,以及事件传播等方面的支持.
从性能方面来看: Application 是一次加载并初始化所有的 Bean 对象(饿汉方式),
而 BeanFactory 是需要哪个才去加载哪个,所以更加的轻量(懒汉方式)
8. getBean 更多用法
(1) 使用 bean name 获取 bean
(2) 根据 bean type 获取 bean
(3) 根据 bean name 和类型获取 bean (推荐使用)
Spring(Spring的理解+DI+Spring的创建)相关推荐
- 互相引用 spring_巧夺天工,这样理解Spring的IOC、DI下来,真的很清晰了
前言 你可能会有如下问题: 想看Spring源码,但是不知道应当如何入手去看,对整个Bean的流程没有概念,碰到相关问题也没有头绪如何下手 看过几遍源码,没办法彻底理解,没什么感觉,没过一阵子又忘了本 ...
- Spring学习-理解IOC和依赖注入
最近刚买了一本介绍ssm框架的书,里面主要对Mybatis.spring.springmvc和redis做了很多的讲解,个人觉得虽然有的内容我看不懂,但是整体上还是不错的.最近正在学习中,一边学习一边 ...
- 谈谈对Spring IOC的理解
2019独角兽企业重金招聘Python工程师标准>>> 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人 ...
- Spring IOC的理解总结
1.1.IoC是什么 Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制, ...
- 谈谈我对Spring IOC的理解
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- 据说,80%的人没有真正理解了Spring的依赖注入
前言 提起Spring,大家肯定不陌生,它是每一个Java开发者绕不过去的坎.Spring 框架为基于 java 的企业应用程序提供了一整套解决方案,方便开发人员在框架基础快速进行业务开发. 在官网中 ...
- Spring 框架 IOC 与 DI 的总结
一:Spring并天下 1:Spring帝国: ①:Spring崛起 什么是Spring:源于Rod Johnson在其著作<Expert one on one J2EE design and ...
- 对Spring IOC的理解
1.2.IoC能做什么 IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序.传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间 ...
- 晋南讲堂之Spring—(二) IOC和DI
IOC(Inversion of Control):其思想是反转资源的获取方向,传统的资源查找方式要求组件向容器发起请求查找资源,容器适时的返回资源.应用了IOC之后,容器主动将资源推送给其管理的 ...
最新文章
- postgresql 数据库远程访问
- linux基础,文件目录管理,cd、rm、mkdir
- ARKit从入门到精通(2)-ARKit工作原理及流程介绍
- 软件工程导论 03章需求分析
- Nginx二级域名及多Server反向代理配置
- Linux系统编程 -- 可执行文件结构与进程在内存中的分布
- Ubuntu 18.04 国内源
- eclipse tomcat maven热部署
- 火狐浏览器怎么支持html5,支持HTML5/CSS技术火狐浏览器8
- Java项目:ssm房屋租赁管理系统
- 如何去除word文档目录前面的黑点和目录后有一页空白页
- java对象的实例化_java实例化对象的几种方式
- 计算机管理员的用户名市什么意思,电脑中的Administrator是什么意思?
- Silverlight C# 游戏开发:草动系统(一)简单的草动
- 蓝凌生态OA,重新定义中大型企业数字化办公
- From Nand to Tetris Week2 2021 超详细笔记
- 印象笔记如何分享链接_几步搞懂印象笔记的链接功能
- HI3515海思开发板移植3G模块笔记
- html内联样式(表),外部样式表
- 接地气,到底什么才是大数据开发工程师?