SpringBean(配置、实例化、作用域、生命周期、装配方式)

简介: SpringBean(配置、实例化、作用域、生命周期、装配方式)

SpringBean(配置、实例化、作用域、生命周期、装配方式)


Bean的配置

Spring相当于一个大型的工厂,用于生产和管理Spring容器中的Bean。如果要使用这个工厂生产和管理Bean,需要开发者将Bean配置在Spring的配置文件中。

有两种配置方式:

(1)XML格式的配置 在实际开发中常用
(2)Properties

Bean的实例化

在面向对象编程中,如果想使用某个对象,需要先实例化该对象。

Spring框架实例化Bean有三种方式:

(1)构造方法实例化:Spring容器可以调用Bean对应类中的无参构造方法来实 例化Bean。

**(2)静态工厂实例化:**使用时要求开发者在工厂类中创建一个静态方法来创建Bean实例。在配置Bean时,class属性定义静态工厂类,同时还要需要使用factory-method属性指定工厂中的静态方法。

**(3)实例化工厂实例化:**使用时要求开发者在工厂类中创建一个实例方法来创建Bean的实例。在配置Bean时,需要使用factory-bean属性指定配置的实例工厂,同时还需要factory-method属性指定实例工厂中的实例方法。

Bean的作用域

Spring5.0中为Bean的实例定义了作用域。如下图:

image.png

在表中的6中作用域中,singleton和prototype是最常用的两种。

Bean的生命周期

一个对象的生命周期包括创建(实例化与初始化)、使使用以及销毁等阶段,在 Spring中, Bean 对象周期也遵循这一过程,但是 Spring 提提供了许多对外接口,允许开发者对三个过程(实例化、初始化、销毁)的前后做一些操作作。在 Spring Bean 中,实例化是为 Bean对象开辟空间,初始化则是对属性的初始化.

Spring 容器可以管理 singleton 作用域 Bean 的生命周期,在此作用域下, Spring 能

精确地知道 Bean 何时战创建,何时初始化完成,以及及何时被销毁。而对于prototype 作的的 Bean , Spring 只负责创建,当容器创建了 Bean 的实实例后, Bean 实例就交给了客户 N 的代码管理, Spring 容器将不再跟踪其生命周期,并且组不会管理那些被配置成 prototype 作脚城的 Bean . Spnng 中 Bean 的生命周期的执行是一个很复杂复杂的过程,可借鉴 Servlet 的生命周期“实例化一初始化( init )一接收请求( service )一销销毁( destroy )”来理解 Bean 的生命周期。

Bean 的生命周期的整个过程如下:

( I )根据 Bean 的配置情况实例化一个 Bean 。

(2)根据 Spring 上下文对实例化的 Bean 进行行依赖注入,即对 Bean 的属性进行初

始化。

(3)如果 Bean 实现了 BeanNameAware 接口,将调用它实现的 setBeanName ( String bcanld )方法,此处参数传递的是 Spring 配配置文件中 Bcan 的 id 。

(4)如果 Bean 实了 BeanFactoryAware 接口,将调用它实现的 settBeanFactory 方法,此处参数传递的是当前 Spring 工厂实例的的引用。

(5)如果 Bean 实现了 ApplicationCiContextAware 按口,将调用它实现的 setApplicationContext(ApplicationContext )方法,此处参数传递的是 Spring 上下文实例的引用。

(6)如果 Bean 关联了 BeanPostProcessor 接口,将调用初初始化方洗postProcess

BeforelnitializationfObject obj , Strirings )对 Bean 进行操作。

(7)如果 Bean 实现了 InitializingBeanin 接口,将调用 afterPropertiesSet 方法。

(8)如果 Bean 在 Spring 配置文件中配置了 init - method 属性,将自动调用其配置的初始化方法。

(9)如果 Bean 关联了 BeanPostProcesassor 接口,将调用postProcessAfteterInitializat0l( Object obj , String s )方法,由于是在 Bean 初初始化结東时调用 After 方法,也可用于内存或缓存技术。

注意:以上工作完成后就可以使用该 Bean ,由于该 Bean 的作用城是 singleton ,所以调用的是同一个Bean实施。

(10)当 Bean 不再需要时将进入销毁阶段,如如果 Bean 实现了 DisposableBean 接口,则调用其实现的 destroy 方法将 Springng 中的 Bean 销毀。

(11)如果在配置文件中通过 destroy - method 属性指定了 Bean 的销毁方法,将调用其配置的销毁方法进行销毁。

在 Spring 中,通过实现特定的接口或通过< bean >元素的属性设置可以对 Bean 的生命周期过程产生影响。开发者可以随意地配置< bean >元素的属性,但不建议过多地使用 Bean 实现接口,因为这样将使代码和 Spring 聚合比较紧密。

Bean的装配方式

Bean的装配方式(即Bean的依赖注入的方式),大体分为两种:


Bean的装配方式
(1) 基于XML的配置的装配
(2) 基于注解的装配

为什么基于注解的装配是常用的?

尽管XML可以简单的装配Bean,但是如果有大量的Bean需要装配,会导致XML文件过于庞大,不方便以后的升级与维护。

接下介绍基于注解装配的七种常用注解,以及应用位置

(1)@Component

该注解是一个泛化的概念,仅仅表示一个组件对象(Bean),可以作用在任何层次上。

(2)@Repository

该注解用于将数据访问层(Dao层)的类标识为Bean,即注解数据访问层Bean,其功能与@Componet相同

(3)@Service

该注解用于标注一个业务逻辑组件类(Service层),其功能与@Component相同

(4)@Controller

该注解用于标注一个控制器组件类(SpringMVC的Controller),其功能与@Componet相同

(5)@Autowired

该注解可以对类成员变量、方法及构造方法进行标注,完成自动装配的功能。通过使用@Autowired来消除setter和getter方法。默认按照Bean的类型进行装配。

(6)@Resource

该注解与@Autowired的功能一样,区别在于该注解默认是按照名称来装配的,只有当找不到与名称匹配的Bean时才会按照类型来装配注入;而@Autowired默认按照Bean的类型进行装配,如果想按照名称来装配注入,则需要和@Qualifier注解一起使用。

@Resource注解有两个属性—name和type。name属性指定Bean实例名称,即按照名称来装配注入;type属性指定Bean类型,即按照Bean的类型进行装配。

(7)@Qualifier

该注解与@Autowired注解配合使用。当@Autowired注解需要按照名称来装配注入时,需要和该注解一起使用,Bean的实例名称由@Qualifier注解的参数指定。

相关文章
|
Java 程序员 Apache
免费申请和使用IntelliJ IDEA商业版License指南
IntelliJ IDEA是广受Java开发者喜爱的工具,其商业版的价格十分昂贵,现在有机会免费获取IntelliJ IDEA的正版License,您是否心动呢?咱们一起行动吧
1072 0
免费申请和使用IntelliJ IDEA商业版License指南
|
9月前
|
人工智能 Java API
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性
548 4
|
Java Nacos Sentinel
Spring Cloud Alibaba:一站式微服务解决方案
Spring Cloud Alibaba(简称SCA) 是一个基于 Spring Cloud 构建的开源微服务框架,专为解决分布式系统中的服务治理、配置管理、服务发现、消息总线等问题而设计。
2530 13
Spring Cloud Alibaba:一站式微服务解决方案
|
缓存 负载均衡 网络协议
|
安全 Linux Shell
runcon命令简介及用途
`runcon`是Linux的SELinux工具,用于在特定安全上下文中运行命令,加强进程权限控制。它允许管理员改变进程的安全上下文,提高安全性,隔离环境,并满足安全标准。命令参数如`-u`(用户),`-r`(角色),`-t`(类型)指定上下文。示例包括以非特权用户身份或特定上下文运行命令。使用时需注意确保SELinux启用,正确指定上下文,并遵循最小权限原则和定期审计。
|
JSON 搜索推荐 Go
ZincSearch搜索引擎中文文档及在Go语言中代码实现
ZincSearch官网及开发文档均为英文,对非英语用户不够友好。GoFly全栈开发社区将官方文档翻译成中文,并增加实战经验和代码,便于新手使用。本文档涵盖ZincSearch在Go语言中的实现,包括封装工具库、操作接口、统一组件调用及业务代码示例。官方文档https://zincsearch-docs.zinc.dev;中文文档https://doc.goflys.cn/docview?id=41。
485 0
|
JSON 数据管理 关系型数据库
【Dataphin V3.9】颠覆你的数据管理体验!API数据源接入与集成优化,如何让企业轻松驾驭海量异构数据,实现数据价值最大化?全面解析、实战案例、专业指导,带你解锁数据整合新技能!
【8月更文挑战第15天】随着大数据技术的发展,企业对数据处理的需求不断增长。Dataphin V3.9 版本提供更灵活的数据源接入和高效 API 集成能力,支持 MySQL、Oracle、Hive 等多种数据源,增强 RESTful 和 SOAP API 支持,简化外部数据服务集成。例如,可轻松从 RESTful API 获取销售数据并存储分析。此外,Dataphin V3.9 还提供数据同步工具和丰富的数据治理功能,确保数据质量和一致性,助力企业最大化数据价值。
586 1
|
Oracle 关系型数据库 数据库
关系型数据库Oracle增量备份
【7月更文挑战第18天】
295 2
WK
|
机器学习/深度学习 监控 算法
反向传播算法是如何工作的
反向传播算法通过最小化损失函数优化神经网络。首先,输入数据经由前向传播得到预测结果,并计算损失;接着,反向传播计算各参数的梯度,并利用梯度下降法更新权重和偏置。这一过程反复进行,直至满足停止条件。算法具备高效性、灵活性及可扩展性,能处理复杂模式识别与预测任务,适用于不同类型与规模的神经网络,显著提升了模型的预测准确性和泛化能力。
WK
550 3
|
定位技术 开发工具
openGPS.cn - 基于ip的定位技术分享,高精度IP定位
利用业余时间自己做了个网站,集成了几个第三方数据源,对比IP地址查询的功能: 普通IP定位:https://www.opengps.cn/Data/IP/IPSearch.aspx 高精度IP定位:https://www.opengps.cn/Data/IP/IPHighAccuracy.aspx 其中,高精度IP定位为百度提供的服务,个人理解其工作原理应当是: 1,用户手机里
7357 1