前言:
大家好,我是良辰丫,我们在上一篇文章不是简单介绍了SpringBoot嘛,为什么不学习SpringBoot,而是要开始Spring呢?Spring是SpringBoot的前身,我们先学习以前的稍微复杂的框架,才能更好的学习SpringBoot.💌💌💌
🧑个人主页:良辰针不戳
📖所属专栏:javaEE进阶篇之框架学习
🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。
💦期待大家三连,关注,点赞,收藏。
💌作者能力有限,可能也会出错,欢迎大家指正。
💞愿与君为伴,共探Java汪洋大海。
1. 初识Spring
1.1 走进Spring
Spring
是 Java EE 编程领域的一款轻量级的开源框架,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,它的目标就是要简化 Java 企业级应用程序的开发难度和周期。- Spring有着活跃⽽庞⼤的社区,这就是它之所以能⻓久不衰的原因。
那么能用简单的话概括一下Spring嘛?
- Spring是包含众多工具方法的IoC容器.
- 一句话诠释了Spring,但是还是什么都不懂,没关系,我们慢慢往下看.
什么是容器呢?
- 想必容器这个概念大家并不陌生,从小学我们开始接触体积的时候就了解了容器,容器可以盛装东西.那么在这里也一样,这里的容器表示可以盛装许多工具方法.
- 在java中我们常见的容器有哪些呢?
集合就是一种数据存储容器.
还有我们学过的Tomcat是web的容器.
IoC是什么呢?
- IoC表示控制翻转(对对象创建的控制权进行翻转,翻转对象的生命周期).
- 那么控制翻转又怎么理解呢?在这里我们控制的是对象,针对某个对象来说的,对对象的控制权本身在我们程序员手里,通过控制翻转,我们可以把控制权交给程序,这样就会做到解耦性.
看了上面的描述,我还是对IoC不太了解,没关系,我们慢慢往下看.
- 我们可以这样理解IoC容器里面存放的是对象.
- 在之前的项目中,我们需要自己去创建对象,自己去调用去使用.
- 而在Spring中我们只需要把对象放在Spring中,用的时候从Spring中取出来,这样我们就把主动权交给Spring了.
1.2 Spring IoC小结
关于Spring IoC我们暂时只需要了解.
- 把对象存到容器中.
- 从容器中取出对象.
对比一下Spring IoC和之前的方式:
- 在之前的方式中,是需要我们自己去new一个对象,需要的时候才去new对象,用完了之后就释放该对象,下次用的时候还需要进行new对象,对时间的开销也是很大的.
- IoC容器相当于把所有可能用到的东西都放到容器里面,用的时候直接去容器里面取就可以了,用完直接放回容器,减小了耦合性,同时也降低了时间的开销.
1.3 DI的学习
- 了解了IoC之后,必须要学习DI,
DI
是 Dependency Injection 的缩写,翻译成中⽂是“依赖注
⼊”的意思。- 所谓依赖注⼊,就是由 IoC 容器在运⾏期间,动态地将某种依赖关系注⼊到对象之中.
IoC和DI的区别:
- 赖注⼊(DI)和控制反转(IoC)是在不同的角度描述同一件事情,通过引⼊ IoC 容
器,利⽤依赖关系注⼊的⽅式,实现对象之间的解耦.- IoC 是“⽬标”也是⼀种思想,⽽⽬标和思想只是⼀种指导原则,最终还是要有可⾏的落地⽅案,⽽ DI就属于具体的实现.
- 可以简而言之,IoC是一种思想,DI是通过这个思想具体做这个事情.
IoC和DI的概念是非常抽象的,打击刚开始接触的时候不容易理解,没关系,咱们一会去创建我们的第一个Spring项目,通过具体的例子了解我们的概念.
2. Spring的创建和使用
上面我们已经了解了IoC容器,现在我们来学习去创建我们的Spring项目.
2.1 创建maven项目
不需要选择1任何模板,直接点击下一步即可.
选择路径和名字,完成即可.
2.2 引入Spring依赖
- 添加的依赖有 spring-context:spring 上下⽂,还有 spring-beans:管理对象的模块。
- 下面的代码块就是我们的依赖代码块,大家直接复制即可.
<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>
2.3 添加启动类
在java目录下创建一个App类,然后引入main方法即可.
public class App {
public static void main(String[] args) {
}
}
2.4 创建Bean对象
在java目录下创建一个User类,其实一个类就是一个对象.
public class User {
public String say(){
return "hello,world";
}
}
2.5 将Bean对象存储到Spring当中
1. 在resources中创建一个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"
xmlns:content="http://www.springframework.org/schema/context"
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>
2. 将Bean对象配置到spring配置文件中.
- id是自己起的名字,不能重复,是唯一身份标识.
- 对象本身是包名+类名,在我们这里没有创建包,只有一个类名.
2.6 从Spring中读取到Bean对象
1. 得到Spring上下文对象.
//1.得到spring上下文对象
ApplicationContext context =
new ClassPathXmlApplicationContext("spring.xml");
2. 从Spring中取出对象.
//2.spring中取出Bean对象
User user = (User) context.getBean("user");
3. 使用Bean对象.
//3.使用Bean对象
System.out.println(user.say());
2.7 运行第一个spring程序
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.xml");
//2.spring中取出Bean对象
User user = (User) context.getBean("user");
//3.使用Bean对象
System.out.println(user.say());
}
}
3. spring获取Bean的几种常见方式
1. 根据id名称来获取Bean.
User user = (User) context.getBean("user");
2. 根据Bean对象类型来获取Bean.
这种方式会有问题,有什么问题呢?当spring中存在相同名称的对象的时候,使用这种方式会报错.
User user = context.getBean(User.class);
3. 根据Bean名称+Bean类型来获取Bean对象.
User user = context.getBean("user",User.class);
4. 使用BeanFactory来作为Spring 的上下文获取对象
XmlBeanFactory在idea中有个删除线,这种方式已经不怎么用了,大家简单了解一下.
public static void main(String[] args) {
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring.xml"));
User user = (User) beanFactory.getBean("user");
System.out.println(user.say());
}
5. ApplicationContext 和 BeanFactory的区别(重点面试)
二者的相同点:
- 都可以通过上下文获取对象.
- 都是来自spring的顶级接口(所谓顶级接口,就是它们的下面还有很多实现类来实现该接口).
二者的不同点:
- 继承关系和功能方面:ApplicationContext属于 BeanFactory 的⼦类,子类除了拥有父类的功能之外,还包含了许多其它的功能,比如资源访问,事件传播等.
- 性能方面:ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象,在后面访问Bean对象时会更快;BeanFactory 是需要哪个才去加载哪个,比较慢,这种情况是轻量级的.
为了让大家更好的理解性能方面的区别,我将举例子进行说明.
ApplicationContext是饿汉模式,也就是没有使用各个对象,但是把所有对象都加载出来.这样为了空间换时间.
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("spring.xml");
System.out.println("已经得到spring对象");
}
BeanFactory是懒汉模式,用的时候才加载,只有调用某个对象才会自动调用它的构造方法.
public static void main(String[] args) {
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring.xml"));
System.out.println("已经得到spring对象");
// User user = (User) beanFactory.getBean("user");
// User2 user2 = (User2) beanFactory.getBean("user2");
}
关于轻量级和重量级?文章来源:https://www.toymoban.com/news/detail-475154.html
- 轻量级和重量级是相对来说的,没有绝对的标准.
- 轻量级是加载某个东西消耗较小的资源.
- 重量级是加载某个东西消耗较多的资源.
后序:
初识Spring到这里也就结束了,大家会发现Spring项目创建起来也没有那么容易,哈哈,咱们慢慢来学习,越往后,越简化,当我们学到SpringBoot的时候就会真正感受到框架的便捷.🍬🍬🍬文章来源地址https://www.toymoban.com/news/detail-475154.html
到了这里,关于【Spring学习】走进spring,spring的创建和使用,spring获取Bean的几种常见方式, ApplicationContext 和 BeanFactory的区别(重点面试)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!