前言
Spring是当今企业最常见最常使用的框架。我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃⽽庞⼤的社区,这就是它之所以能⻓久不衰的原因。Spring ⽀持⼴泛的应⽤场景,它可以让 Java 企业级的应⽤程序开发起来更简单。
在官方网站里介绍到何为Spring:
好像还是有点晦涩难懂,可以用更简单的一句话来概括:Spring就是包含了众多工具方法的IoC容器。
Ioc是啥?容器又是啥?
1.容器的含义
容器就是容纳很多物品的装置,就好比List/Map 都是容器。
2.Ioc的含义
IoC:Inversion of Control 翻译过来就是控制权翻转,字面意思就是将某个对象或者是物品把他控制权翻转过去~~
依旧是晦涩难懂的定义,我们用以下代码案例来理解一下:
我们要造一个Car类 来模拟造一个“车”,有一个Car类就需要一个Framework类,而Framework类又需要Bottom类,而Bottom类又依赖一个Tire类.
我们可以看到每个类除了Tire类之外都有一个类需要依赖,比如说在car类里 创建了或者说是new了一个Framework对象,也就是说Framework这个创建和销毁都掌握在了Car类的手上,而且还要注意的是Tire改变size的时候,就在所有类都需要进行修改~~
而IoC就是
而类创建的顺序从 Car->Tire 变成了Tire->Car 相比较平常的代码IoC的优点是:1.解耦合 2.控制权反转~~
3.理解Spring IoC
Ioc是思想 SpringIoC是一种框架。
既然 Spring 是⼀个 IoC(控制反转)容器,重点还在“容器”⼆字上,那么它就具备两个最基础的功能:
将对象存⼊到容器;
从容器中取出对象。
也就是说学 Spring 最核⼼的功能,就是学如何将对象存⼊到 Spring 中,再从 Spring 中获取对象的过程
3.1Spring IoC的优点
1.解耦
2.使用更加方便了 不需要关注背后的依赖关系,就不受束缚进行操作了
3.更加高效 不需要多次new对象了~~
Spring 是⼀个 IoC 容器,说的是对象的创建和销毁的权利都交给 Spring 来管理了,它本身⼜具备了存储对象和获取对象的能⼒
4.DI
DI:依赖注入 依赖注入:当在框架运行的时候,动态的将依赖的某个对象注入到当前这个类中。DI和IoC其实说的是一件事,只是看待的事物的角度不同
所谓依赖注⼊,就是由 IoC 容器在运⾏期间,动态地将某种依赖关系注⼊到对象之中。所以,依赖注⼊(DI)和控制反转(IoC)是从不同的⻆度的描述的同⼀件事情,就是指通过引⼊ IoC 容器,利⽤依赖关系注⼊的⽅式,实现对象之间的解耦。
IoC 是“⽬标”也是⼀种思想,⽽⽬标和思想只是⼀种指导原则,最终还是要有可⾏的落地⽅案,⽽ DI就属于具体的实现。
1.Spring 创建和使用
1.1Spring项目创建
1.1.1先创建一个Maven项目
1.1.2添加spring-context依赖
在Maven官网找到spring context 然后在pom.xml文件中输入以下代码:
而在加载之前还需要改成国内的镜像网站,因为网络的不稳定可能jar包会下不全。
在setting.xml中修改以下内容
1.1.3 创建启动类
说是启动类就是psvm啦很简单
2.Spring存储Bean对象
2.1先创建一个Bean(在Java一个对象被多处使用,就可以称之为Bean)
2.2将Bean存储到Spring容器中
在resources下创建一个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/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
</beans>
存储的时候,就是在xml内 加一个bean标签 id 是自己定义的名字,class变成类名
以上操作就完成了存储Bean对象~~
3.Spring读取Bean对象
如果想要读取Bean对象就要先获得Spring对象,而想要获取Bean对象常用的俩个方法一个是ApplicationContext 另一个是BeanFactory。
//得到 Spring 的上下⽂对象,创建的时候需要配置 Spring 配置信息
ApplicationContext context = new ClassPathXmlApplicationContext("spring-con
fig.xml");
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("springconfig.xml"));
以下案例展示一下读取Bean对象:
获取到Spring对象之后通过getBean方法获取到Bean对象 getBean方法有三种传参方式:
1.传名称,但是前面要强转
2.传类名,但会出现在Spring内一个类有多个Bean对象
3.名称,类名都传 -> 最常用的
ApplicationContext VS BeanFactory(常见面试题)
● 继承关系和功能方面来说:Spring 容器有两个顶级的接口:BeanFactory 和 ApplicationContext。其中 BeanFactory 提供了基础的访问容器的能力,而 ApplicationContext 属于 BeanFactory 的子类,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性,还添加了对国际化支持、资源访问支持、以及事件传播等方面的支持。
● 从性能方面来说:ApplicationContext 是一次性加载并初始化所有的 Bean 对象,而 BeanFactory 是需要那个才去加载那个,因此更加轻量。
PS:而 ClassPathXmlApplicationContext 属于 ApplicationContext 的子类,拥有 ApplicationContext 的所有功能,是通过 xml 的配置来获取所有的 Bean 容器的。
关于Bean对象存取详情请见图文并茂,揭秘 Spring 的 Bean 的加载过程 - 简书 (jianshu.com)