1 Spring概述
1.1 Spring定义
Spring是一款主流的 Java EE 开源框架,目的是用于简化Java企业级引用的开发难度和开发周期。从简单性、可测试性的角度而言,任何Java应用都可以从Spring中受益。Spring框架提供自己提供功能外,还提供整合其他技术和框架的能力。
自2004年4月,Spring1.0 版正式发布以来,Spring已经步入到了第6个大版本,即 Spring6。
Spring官网地址:https://spring.io/
1.2 Spring核心
Spring指的是Spring Framework,通常我们称之为Spring框架。
Spring的两个核心模块
- IoC控制反转
Inverse of Control 的简写,为 控制反转,指把创建对象交给 Spring 进行管理。
即:反转资源获取方向,把自己创建资源、向环境索取资源的方式变为环境自动将资源准备好,我们享受资源注入。 - AOP面向切面编程
Aspect Oriented Programming 的简写,为 面向切面编程。AOP 用来封装多个类的公共行为,将那些与业务无关,却为业务模块共同调用的逻辑封装起来,减少系统的重复代码。
2 入门案例
工程环境
- JDK版本:Java 8-15
- Spring版本:5.3.24
具体步骤
- 聚合工程下构建子工程 _03spring;
- pom.xml中添加依赖并刷新 Maven;
- 工程中创建包 cn.tedu.spring.example,并创建类 User.java,添加 @Component 注解;
- 创建测试类 TestUser.java 进行测试;
3 相关概念
3.1 IoC
IoC(Inversion of Control,控制反转)是一种编程思想;
IoC 是将对象的创建和管理交由框架来完成,而不是由开发人员手动创建和管理。
3.2 IoC容器
IoC容器是用来实现IoC思想的一个工具或者说技术手段;
它能够自动扫描应用程序中的对象,将它们实例化,并自动注入它们所需要的依赖对象,使应用程序的开发人员能够更加专注于业务逻辑的实现,而不用关心对象的创建和管理。Spring通过IoC容器来管理所有的Java对象的实例化和初始化,控制着对象与对象之间的依赖关系。
我们将由IoC容器管理的Java对象成为 Spring Bean,它与使用关键字 new 创建的Java对象没有任何区别。
3.3 依赖注入DI
DI (Dependency Injection):依赖注入,依赖注入实现了控制反转的思想,是指Spring创建对象的过程中,将对象依赖属性通过配置进行注入。
所以 IoC 是一种控制反转的思想,而依赖注入 DI 是对 IoC 的一种具体实现。
Bean管理:指Bean对象的创建,以及Bean对象中属性的赋值
4 IoC容器实现
Spring中的IoC容器就是IoC思想的一个落地产品实现。IoC容器中管理的组件也叫做bean。在创建bean之前,首先需要创建IoC容器,Spring提供了IoC容器的两种实现方式
- BeanFactory
这是IoC容器的基本实现,是Spring内部使用的接口,面向Spring本身,不提供给开发人员使用。 - ApplicationContext
BeanFactory的子接口,提供了更多高级特性,面向Spring的使用者,几乎所有场合都使用 ApplicationContext,而不使用底层的BeanFactory。 - ApplicationContext的主要实现类
5 注解管理Bean
5.1 Bean对象定义
5.2 Bean对象获取
通过 ApplicationContext 对象获取:调用 ApplicationContext 对象的 getBean() 方法,传入对应类的类型即可获取该 Bean 对象,示例:
5.3 应用分析
在 cn.tedu.spring 下创建子包 bean ,进行 bean 对象的创建及获取
- 在bean包下创建类:UserDao
- 在bean包下创建测试类:TestUserDao
说明:将java类中的 @Repository注解 替换为 @Component注解、@Service注解、@Controller注解 都是可以的。
6 依赖注入DI
DI (Dependency Injection):依赖注入,依赖注入实现了控制反转的思想;
是指Spring创建对象的过程中,将对象依赖属性通过配置进行注入。
所以 IoC 是一种控制反转的思想,而依赖注入 DI 是对 IoC 的一种具体实现。
6.1 @Value注解
@Value 注入是将属性值直接注入到 bean 中,主要用于注入一些简单类型的属性(如字符串、基本类型等);
使用时需要注意属性的类型和格式,否则会导致注入失败。
示例:在UserDao中进行属性值注入
- 在UserDao的属性中通过@Value注解注入属性值
- 执行测试方法进行测试
6.2 @Autowired注解
@Autowired 注入是将对象注入到 bean 中,并且在注入对象时会根据依赖注入容器中 bean的类型 进行匹配。
如果容器中有多个类型匹配的bean存在,则会抛出异常。
因此,@Autowired注入常用于注入复杂对象、接口类型的属性或其他bean实例。
6.2.1 根据类型注入
定义UserService类,并注入UserDao对象
- 在包bean下创建 UserService 类
- 调整测试方法
- 执行测试方法测试
6.2.2 根据接口类型注入
- 创建接口 Cache
- 创建该接口实现类 CacheImpl1 ,并添加 @Component注解
- 创建类 UserCache ,并注入 CacheImpl1对象
- 创建测试类 TestUserCache 进行测试
总结: 当一个接口有一个唯一的实现类时,Spring框架会通过接口找到该接口对应的实现类,并进行bean对象的创建以及DI注入操作。
问题:那么如果一个接口有多个实现类,Spring框架会创建对应的 java bean 对象吗?
- 创建 Cache 接口的实现类 CacheImpl2
- 执行测试方法,确认是否成功
总结: 当一个接口有多个实现类时,Spring无法确定注入哪个实现类对象,因此会报错,可以结合 @Qualifier注解 来解决这个问题。
6.2.3 @Qualifier注解
@Qualifier注解是用于限定一个接口有多个实现类时,根据指定的限定条件来选择具体的实现类的注解;
当Spring容器中存在多个实现同一接口的bean时,在注入时,由于不能确定注入哪一个实现类,就需要通过@Qualifier注解来明确指定要注入的bean的名称。
@Qualifier注解演示
- 在 UserCache 中添加 @Autowired注解 和 @Qualifier注解
- 在 CacheImpl1 实现类中 @Component注解 中添加组件名
- 执行测试方法进行测试
总结:在@Component注解中可以不用指定组件名称,默认为当前类的 类名首字母小写。
6.3 @Resource注解[了解]
@Resource 注解是 JavaEE 提供的注解之一,也支持在 Spring Framework 中使用。在 Spring 中,它可以用来注入 Bean 实例,与@Autowired注解的作用类似,但其也有自己的一些特点。
- @Resource 注解是JDK扩展包中的,也就是说属于JDK的一部分。所以该解释是标准注解,而 @Autowired 注解是 Spring 框架自己的。
- 装配规则
- @Resource 注解默认根据名称装配 byName;
- 当未指定 name 时,则使用属性名作为 name 进行装配;
- 如果通过 name 也未找到,则会自动启动通过类型 byType 装配。
而@Autowired注解默认根据类型装配byType,如果想根据名称匹配,需要配合@Qualifier注解一起使用。
课堂示例
- 包名:resource
- 接口:ResMapper
- 实现类1:ResMapperImpl1
- 实现类2:ResMapperImpl2
- DI注入类:WeiboMapper
- 测试类:TestWeiboMapper
总结
- 指定 @Resource 中的 name,则根据名称装配;
- 未指定 name 时,则根据属性名装配;
- 未指定 name,属性名也不一致,则根据类型装配.
7 Bean的作用域
7.1 说明
在Spring框架中,Bean是按照作用域来创建的,常见的作用域有两种:Singleton 和 Prototype。其中,Singleton (单例)是指整个应用中只有一个实例,并在第一次请求时创建实例。而 Prototype (多例)是指每次请求都会创建一个新的实例并返回,每个实例之间是相互独立的。可以通过 @Scope 注解来指定,默认是单实例。
7.2 单实例与多实例
- 单实例
单实例(Singleton)是指某个类只能创建唯一的一个实例对象,并且该类提供一个全局的访问点(静态方法)来让外界获取这个实例,常常用在那些只需要一个实例来处理所有任务的场景下,例如数据库连接。 - 多实例
多实例(Multiple Instance)则是指可以在同一个类的定义下,创建多个实例对象。每个对象都是相互独立的,有自己的状态和行为;常常用于需要同时处理多个任务的场景。
在Spring中可以通过 @Scope 注解来指定bean的作用域范围,具体如下
7.3 应用分析
- 第1步:在 cn.tedu.spring 下创建子包 scope ,并创建类 DBConnect
- 第2步:创建测试类进行测试
- 总结
- 当为单例模式 singleton 时,多次获取bean实例的地址是相同的
- 当为多例模式 prototype 时,多次获取bean实例的地址是不同的
单例模式适用于需要共享数据并且需要避免重复创建实例的情况。而多例模式适用于需要动态地创建对象并提供独立实例的情况。
8 Bean的生命周期
8.1 说明
程序中的每个对象都有生命周期,对象的创建、初始化、应用、销毁的整个过程称之为对象的生命周期;
在对象创建以后需要初始化,应用完成以后需要销毁时执行的一些方法,可以称之为是生命周期方法;
在spring中,可以通过 @PostConstruct 和 @PreDestroy 注解实现 bean对象 生命周期的初始化和销毁时的方法。
- @PostConstruct 注解
生命周期初始化方法,在对象构建以后执行。 - @PreDestroy 注解
生命周期销毁方法,比如此对象存储到了spring容器,那这个对象在spring容器移除之前会先执行这个生命周期的销毁方法(注:prototype作用域对象不执行此方法)。
8.2 完整生命周期
- 实例化阶段(bean对象创建)
在这个阶段中,IoC容器会创建一个Bean的实例,并为其分配空间。这个过程可以通过 构造方法 完成。 - 属性赋值阶段
在实例化完Bean之后,容器会把Bean中的属性值注入到Bean中,这个过程可以通过 set方法 完成。 - 初始化阶段(bean对象初始化)
在属性注入完成后,容器会对Bean进行一些初始化操作; - 使用阶段
初始化完成后,Bean就可以被容器使用了
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/18455.html