目录
一.Spring项目的创建
二.存储Bean
2.1创建Bean对象
2.2Bean注入
三.读取Bean
3.1得到Spring上下文
3.2获取指定Bean对象
3.3为什么不使用new呢?
四.获取Bean的三种方式
4.1 BeanFactory类
4.2两者区别
4.3获取Bean的优化操作
五.总结
一.Spring项目的创建
Spring项目创建分三个步骤:
- 创建meven项目
- 添加Spring框架支持
- 添加启动类
第一步:
第二步:添加框架:
在pom.xml里添加两个依赖:
Spring 框架的⽀持:spring-context:spring 上下⽂,spring-beans:管理对象的模块。
<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>
添加依赖之后,如果爆红了,表明正在下载资源,需要等待。
下载成功示例图:
注:由于有些依赖实现基于另外的依赖实现,因此下载的依赖不是一个!!!
第三步:添加启动类
就是创建一个含有main函数的类
二.存储Bean
Spring的灵魂就是存储管理Bean。
2.1创建Bean对象
创建一个类,任意的类,这边为一个User类:
public class User {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
2.2Bean注入
创建成功之后,我们将Bean交给Spring保管!因此我们需要在在resources资源目录下创建一个 Spring 配置⽂件spring-config.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>
我们在配置文件中使用<Bean>标签,将类注入到Spring当中。
示例图:
注:关于id名,虽然不一定需要和类名相同,将ID命名为与类名相同可能会使代码更加清晰易读。
三.读取Bean
3.1得到Spring上下文
获取Spring上下文,我们可以采取ApplicationContex 类,创建时,配置一下Spring的配置文件!
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
注:ClassPathXmlApplicationContext是实现ApplicationContext接口的类,扫描配置文件(名字一定要一模一样),获取Spring容器的Bean对象。
3.2获取指定Bean对象
获取Bean对象的时候,也就是从context当中获取,使用getBean()方法.
User user = context.getBean("user", User.class);
注意:这个user就是注入到Spring容器的Id名。
3.3为什么不使用new呢?
原因有以下几点:
-
松耦合:通过依赖注入,对象之间的依赖关系不再硬编码在代码中,而是由容器动态注入。这样可以减少对象之间的耦合度,使代码更加灵活、易于维护和测试。
-
可测试性:使用依赖注入可以更轻松地进行单元测试。在测试时,可以使用模拟对象(Mock Object)替代真实的依赖对象,从而隔离被测试的对象,使单元测试更加简单、可靠。
-
可扩展性:通过依赖注入,可以方便地替换和更新对象的实现,而不需要修改客户端代码。这样在系统需求变化时,可以更容易地进行扩展和修改。
-
更好的管理对象生命周期:Spring 容器负责管理 Bean 的生命周期,包括创建、初始化、销毁等过程。通过依赖注入,可以将对象的生命周期交给 Spring 容器管理,确保对象的合理创建和销毁,避免内存泄漏和资源浪费。
-
AOP 支持:依赖注入是实现 Spring AOP 的基础。通过依赖注入,Spring 可以在运行时动态地创建代理对象,实现面向切面编程,例如事务管理、日志记录等功能。
或许你看不懂,但是在本专栏里,有更好的解释,你只要知道聪明的人都是靠依赖注入获取Bean
四.获取Bean的三种方式
4.1 BeanFactory类
之前的ApplicationContext就是一种方式,但是我现在说的是另一种。
BeanFactory:
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
获取Bean的执行代码:
public class APP {public static void main(String[] args) {BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));User user = beanFactory.getBean("user",User.class);}
}
4.2两者区别
BeanFactory和ApplicationContex 的区别:
功能上的区别:
ApplicationContext
在初始化容器时就会实例化所有的 Bean,提前进行依赖注入、初始化和单例模式的创建等操作,因此启动时间相对较长,但对于用户来说,获取 Bean 时速度较快。BeanFactory
在初始化容器时不会实例化所有的 Bean,而是在获取 Bean 时才进行实例化。因此启动时间较短,但是在获取 Bean 时可能会稍微慢一些。
场景上:
- 如果应用程序需要提前加载所有的 Bean,并且对启动时间没有特别高的要求,可以选择使用
ApplicationContext
。 - 如果应用程序的启动时间较为重要,而且有些 Bean 可能很少被使用,可以选择使用
BeanFactory
。
线程安全性:
ApplicationContext
是线程安全的,因此可以在多线程环境下共享。BeanFactory
不是线程安全的,如果需要在多线程环境下使用,需要采取额外的措施来保证线程安全性。
4.3获取Bean的优化操作
在使用上述两种类获取Bean情况下,我们可以优化一下。
User user1 = beanFactory.getBean("user",User.class);
User user = context.getBean("user",User.class);
是的,就是在这个地方优化。
1通过名称获取优化
User user1 = (User) beanFactory.getBean("user");User user = (User) context.getBean("user");
注意 :如果容器中没有名为 "user" 的 Bean,或者该 Bean 的类型不是 User
,则会抛出 NoSuchBeanDefinitionException
异常。
2.通过类名获取
User user1 = beanFactory.getBean(User.class);User user = context.getBean(User.class);
五.总结
- Spring项目的创建
- 创建一个Maven项目
- 添加Spring框架依赖 【spring-context】
- 添加启动类 【功能:为后面从Spring容器中读取Bean做准备】
- 存储Bean
- 创建Bean对象
- 将Bean注册到Spring容器中 【spring-config.xml配置文件】
- 读取Bean
- 得到Spring 对象【ApplicationContext,BeanFactory】
- 通过Spring 对象的 getBean() 方法获取到Bean对象 【DI操作】
- 使用Bean对象 【非必须】