目录
1.1 使用 ApplicationContext 作为Spring上下文
1.2 使用 BeanFactory 作为Spring上下文
4. Application 和 BeanFactory的区别
一. 创建 Spring项目
1. 创建Maven项目;
2. 在pom.xml 中添加 Spring 框架支持,如下代码;(此处注意版本的对应)
3. 添加启动类,测试运行;
(此处可以进行 Maven 的国内源配置)
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.26</version>
</dependency>
二. 存储 Bean 对象到Spring中
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"
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 对象
3. 将 Bean 存储到 Spring 容器中
使用 Bean 标签来存储,id 关键字表示Bean对象的名称,class 关键字表示该类的路径(包名+类名)。
三. 从 Spring 中获取并使用 Bean 对象
1. 创建 Spring 上下文
1.1 使用 ApplicationContext 作为Spring上下文
ApplicationContext app = new ClassPathXmlApplicationContext(配置文件名);
1.2 使用 BeanFactory 作为Spring上下文
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource(配置文件名));
2. 从 Spring 中获取到指定的 Bean 对象
使用 getBean(Bean对象的名称) 方法获取;
getBean()方法返回的类型是Object,因此要记得进行类型转换;
BeanFactory 同理;
3. 使用 Bean
BeanFactory同理;
4. Application 和 BeanFactory的区别
两者都可以从 Spring 中获取 Bean对象;
ApplicationContext继承于BeanFactory。
首先创建一个 Teacher类和 Student类,并设置其构造方法;
存储两个 Bean 对象到 Spring 容器中,分别为 Student类 和 Teacher类;
观察运行结果:
可以看出 ApplicationContext 在执行创建 ApplicationContext 对象的时候,就把配置文件中所有Bean对象创建存储在 Spring容器中了,而 BeanFactory只有在执行 getBean() 方法的时候才去加载对应的Bean对象,且不是把配置文件中所有Bean对象都加载,而是只加载getBean()方法对应的Bean对象。
ApplicationContext 比较费内存,一次性加载并初始化所有的 Bean 对象,之后的读取会非常快,效率高;
BeanFactory 节省内存,调用时才会加载初始化 Bean 对象到 Spring 中,效率不高;
5. 获取 Bean 的三种方法
1. 通过名称获取
getBean(Bean对象的名称);
Student student = (Student) applicationContext.getBean("student"); // 根据名称获取
方法返回 Object 对象,因此需要进行强转;并且不允许 Spring 容器中同时存在多个对象名称相同的Bean,否则会报错;
且当 getBean() 方法返回 null 时,也就是找不到对应 id 的 Bean 对象时,也会抛出异常;
2. 通过类型获取
getBean(Bean对象的类);
Student student =applicationContext.getBean(Student.class); // 根据类型获取
这种方法就避免了强制类型转换,但是当同一个类在spring容器当中注入了两个不同的对象的时候,就会抛出异常。
3. 通过名称+类型方式获取
getBean(Bean对象的名称,Bean对象的类);
Student student = applicationContext.getBean("student",Student.class); // 根据名称+类型查询对象
此方法相比于前面两种就更加的严谨明确了,所以平时使用的更多。
补充说明:通过 Spring 上下文对象 getBean() 方法获取到 Bean 对象就是所谓的 DI 操作。