您现在的位置是:首页 >学无止境 >Spring项目创建与 Spring Bean 的存储与读取网站首页学无止境
Spring项目创建与 Spring Bean 的存储与读取
目录
2.3.4 ApplicationContext VS BeanFactory(常见面试题)
前言:我们知道,Spring 就是⼀个包含了众多⼯具⽅法的 IoC 容器。既然是容器那么它就具备
两个最基本的功能:
- 将对象存储到容器(Spring)中;
- 从容器中将对象取出来。
一、创建Spring项目
接下来使⽤ Maven ⽅式来创建⼀个 Spring 项⽬,创建 Spring 项⽬和 Servlet 类似,总共分为以下 3步:
- 创建⼀个普通 Maven 项⽬。
- 添加 Spring 框架⽀持(spring-context、spring-beans)。
- 添加启动类。
在 Java 语⾔中对象也叫做 Bean,所以后⾯咱们再遇到对象就以 Bean 著称。
1.1 创建Maven项目
当目录变成如下所示时,Maven项目就初始化好了。
1.2 添加 Spring 框架依赖
从中央仓库中下载Spring Context的依赖:
1.3 添加启动类
最后在创建好的项目Java文件夹下创建一个启动类,包含main方法即可:
二、Bean对象的创建与存储
2.1 创建Bean
所谓的 Bean 就是 Java 语⾔中的⼀个普通对象,实现代码如下:
2.2 将Bean注册到容器
在创建好的项目中添加 Spring 配置文件 spring-config.xml,将此文件放在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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
接下来,再将Student对象注册到Spring中即可,具体操作如下:
2.3 获取并使用Bean对象
获取并使用Bean对象,分为以下三步:
- 得到Spring(上下文)对象,因为对象都交给Spring管理,所以获取对象要从Spring中获取,那么就先得到Spring的上下文。
- 通过Spring(上下文),获取某一个指定的Bean对象
- 使用Bean对象
如果取多个 Bean 的话重复以上第 2、3 步骤。
2.3.1 创建Spring上下文
利用ApplicationContext来创建Spring 上下文:
需要注意的是:这里的路径必须与Spring配置文件的名称相同,否则无法创建成功。
2.3.2 从Spring容器中获取Bean对象
延申(多种方式获取Bean):
1.通过名称获取:
2.通过类型获取:
需要注意,如果Spring中一个类型存储了多个实例,那么使用类型获取Bean就会报错:
在一个类在bean中存储了两次,那么这两个bean地址是否相同呢,我们来验证一下:
因此,这里创建的两个不同的bean实例,地址是不同的,不会因为存的是同一个类的bean就地址一样。
3.通过名称+类型方式获取:
2.3.3 使用bean
import com.spring.demo.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
//1.得到Spring的上下文对象,创建的时候需要配置 Spring配置 的信息
ApplicationContext context =
new ClassPathXmlApplicationContext("Spring-config.xml");
//2。从Spring容器中获取到Bean对象
Student student = (Student)context.getBean("student");
//3.使用Bean(非必须的)
student.sayHi();
}
}
运行结果:
2.3.4 ApplicationContext VS BeanFactory(常见面试题)
除了ApplicationContext之外,我们还可以使用BeanFactory来作为Spring的上下文,如下代码所示:
我们发现,好像在当前的场景下,ApplicationContext 和 BeanFactory 效果是一样的,这是因为ApplicationContext属于BeanFactory的子类:
既然是两者之间存在继承关系,那我们来看看两者之间有哪些区别:
我们先在com.spring.demo包下创建一个Teacher类:
并在Spring配置文件下,把Teacher存到Spring中:
观察两者的区别:
可以发现,Application是一次性加载并初始化所有的Bean对象,而BeanFactory属于懒加载,是需要哪个才去加载哪个,因此BeanFactory更加轻量。
ApplicationContext 和 BeanFactory的区别总结
- 继承关系和功能⽅⾯来说:Spring 容器有两个顶级的接⼝:BeanFactory 和ApplicationContext。其中 BeanFactory 提供了基础的访问容器的能⼒,⽽ApplicationContext属于 BeanFactory 的⼦类,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性,还添加了对国际化⽀持、资源访问⽀持、以及事件传播等⽅⾯的⽀持。
- 从性能⽅⾯来说:ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象,⽽BeanFactory 是需要那个才去加载那个,因此更加轻量,因此ApplicationContext比较费内存,一次性加载完成,但是在之后的读取速度会非常快,而BeanFactory因为需要节省内存,调用时才加载初始化bean,所有效率不高。
三、总结
a.创建Spring项目
- 创建一个maven项目
- 添加Spring-context依赖
- 创建一个启动类(为后面从Spring容器中获取bean做准备)
b.存储Bean
- 先创建Bean对象
- 通过Spring配置文件(spring-config.xml)<bean id="bean名称" class="包名+类名" ></bean>
c.读取bean
- 得到Spring对象(ApplicationContext,BeanFactory)
- 通过Spring对象 getBean方法获取Bean对象【DI操作】
- 非必须:使用bean