努力经营当下,直至未来明朗!
文章目录
普通小孩也要热爱生活!
一、Spring核心思想
【面试重点关注:自己理解后的总结,而不是照本宣科】
- Spring的概念:我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃⽽庞⼤的社区,这就是它能⻓久不衰的原因。Spring ⽀持⼴泛的应⽤场景,它可以让 Java 企业级的应⽤程序开发起来更简单。
- 概括:Spring就是==一个包含了众多工具方法的IoC容器。
1. 容器
- 容器:就是用来容纳某种物品的(基本)装置。
- 我们接触的容器:
① List/Map -> 数据存储容器
② Tomcat -> Web 容器
2. IoC
- IoC是“控制反转”(Inversion of control),是对对象的生命周期进行控制反转,也就是将对象生命周期控制权交给Spring去管理。
- IoC容器的优点:解耦合
1)传统开发:有耦合性问题,程序中一部分改变,与其相关的所有代码都需要连同改变。
2)Ioc开发:依赖性传参是直接将对象作为参数进行传递,修改其中一个不太影响另外的类。
控制反转其实是修改对象的生命周期,不再是自己控制,而是交由别的对象来控制的。(生命周期控制权的反转)
3)面试回答问题:举栗子(依赖 + IoC)
3. SpringIoC
- 如何理解“Spring 是⼀个 IoC容器”这句话呢?
答:① Spring 是⼀个 IoC(控制反转)容器,重点还在“容器”⼆字上,那么它就具备两个最基础的功能:将对象存入容器和从容器中取出对象。
② 也就是说学 Spring 最核⼼的功能,就是学如何将对象存⼊到 Spring 中,再从 Spring 中获取对象的过程。
- 将对象存放到容器中的好处:将对象存储在 IoC 容器,相当于将以后可能⽤的所有⼯具制作好都放到仓库中,需要的时候直接取就⾏了,⽤完再把它放回到仓库。
- ⽽ new 对象的⽅式相当于,每次需要⼯具了才现做,⽤完就扔掉了也不会保存,下次再⽤的时候还得重新做,这就是 IoC 容器和普通程序开发的区别。
- 小结:容器:相当于仓库,持久;
new对象:用到才创建,用完就扔。
③ Spring 是⼀个 IoC 容器,说的是对象的创建和销毁的权利都交给 Spring 来管理了,它本身⼜具备了存储对象和获取对象的能⼒。
4. DI概念说明
【面试题】简要说明IoC和DI的区别
1)概念:
IoC是控制反转,也就是反转对象的生命周期的控制方; DI是依赖注入(dependency injection),在程序运行期间,动态的将某中依赖引入到当前对象的行为/机制。
2)从广义上来说:IoC=DI,是从不同的维度来描述同一个问题,就是指通过引⼊ IoC 容器,利⽤依赖关系注⼊的⽅式,实现对象之间的解耦。
3)IoC是一个设计思路,DI是具体实现。
【补充】程序开发的基本规范:
① 和程序相关的所有地方不能出现任何中文。如:项目的目录不能出现中文,项目的名称不能出现中文
② 和代码相关的命名不能是拼音或汉字,一定是英文。
二、Spring的创建和使用
1. 创建Spring项目
-
Spring项目的创建步骤:
1)创建一个Maven项目
2)添加Spring框架依赖(spring-context、spring-beans)【关键!】
3)创建启动类(这是非必要的,但是相当于一个单元测试) -
添加Spring框架依赖
但是:是有可能导入失败的!
此时参考下面Maven项目导入jar包和设置国内源的方法。
3. Maven项目导入jar包和设置国内源的方法:
1)配置好国内的Maven源
① File中的Settings和 Settings for New Projects… 都要进行设置
② -> 搜索maven,并进行该页面上相关设置
③ -> 使用VSCode打开对应目录下的settings.xml文件,并找到mirrors进行修改配置(建议配置阿里云镜像)
(如果没有settings.xml文件就自己添加,有的话千万不要覆盖)
④ 此时重新reload就行
2)如果还是错误,删除本地maven仓库的jar包并重新下载:【目前本地仓库的jar包可能是不完整的jar包】
File -> Settings -> 搜索Maven -> 找到路径,打开该目录并删除所有文件 -> 然后reload就行
3)如果reload之后还是错误,重复1)2)步骤至少三次!
4)如果还是错误,就可能是以下问题:
① 上⾯的步骤没看仔细:重新认真的逐字逐句的观看和配置;
② Maven 路径中出现中⽂:如果出现中⽂会导致下载了 jar 包,但是在项⽬中不能正常使⽤;
③ 当前⽹络运营商有问题:当前所在区域连接的⽹络运营商(中国电信、移动…)连接数据源有问题,尝试更好⽹络,使⽤⼿机热点或朋友的⼿机热点尝试,如果还是还⾏,间隔 4 ⼩时之后再试。
2. Spring对象的存储/存储Bean对象
-
先创建Bean对象:其实也就是创建一个类
-
将Bean对象存储到Spring中:通过xml来实现的
1)在resources中添加Spring配置⽂件spring-config.xml
:resources -> new -> File -> 命名没有特殊要求,但是尽量能够表明文件是啥(注意加上后缀!)
2)将Bean对象配置到Spring配置文件spring-config.xml中:id自己设(是bean对象的别名,不能重复),class是对象本身:包名.类名(没有包就直接类名即可)
【后期进行读取bean对象就是通过id进行获取到的】
3. 从Spring中读取到Bean对象/获取Bean对象并使用
- 读取对象:在java源文件中读取
- 得到Spring上下文对象
① 使⽤ ApplicationContext(常用):
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
// 这里的参数名字一定要和resources底下的xml文件名相对应!
② 使用BeanFactory:
BeanFactory context =
new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
- 从Spring中取出Bean对象
① 使用getBean方法,参数是id(与之前在xml中设置的id一定要对应!)需要进行类型强转。【如果是null强转就会出错】
② 使用getBean方法,参数是类对象(但是当spring-config.xml中存在相同类对象之后就会出现问题)
③ 使用getBean方法,第一个参数是id,第二个对象是类对象.class。【最常使用】
- 使用Bean(可选)
5.【经典面试题】在得到Spring对象时有两种方式(ApplicationContext和BeanFactory),这两种方式有何区别?
1)相同点:
① 都可以得到Spring上下文对象
② 都是来自Spring的顶级接口
2)区别:
① 继承关系和功能:ApplicationContext属于BeanFactory的子类;ApplicationContext的功能多于BeanFactory,BeanFactory只有最基础访问Bean的能力,而ApplicationContext除了拥有BeanFactory功能之外,还包含了更多的功能,如:国际化支持、资源访问、事件传播等。
② 性能方面:ApplicationContext加载方式是将Bean对象一次性加载,所以在后面访问Bean对象时会很快;BeanFactory需要某个Bean对象时,才去加载该Bean对象,所以它在执行Bean获取时比较慢。【也就是:用空间换时间】
(ApplicationContext有自己的一套策略)
PS:⽽ ClassPathXmlApplicationContext 属于 ApplicationContext 的⼦类,拥有 ApplicationContext 的所有功能,是通过 xml 的配置来获取所有的 Bean 容器的。
- 补充:
① 静态方法:全局的工具方法,类加载时就存在。
② 实例方法/普通方法:需要时才进行实例化。
小结
- Spring 是什么?其核心思想是啥?
- DI和IoC的区别是啥?
- Spring的创建和使用:
① 配置xml文件
② 存对象(Bean创建、xml中配置bean对象)
③ 取对象(获取Spring上下文、获取Bean对象、使用Bean对象)