当前位置: 首页 > news >正文

Spring | Spring中的Bean--下

Spring中的Bean:

    • 4.Bean的生命周期
    • 5.Bean的配装配式 ( 添加Bean到IOC容器的方式 + 依赖注入的方式 )
      • 5.1 基于XML的配置
      • 5.2 基于Annotation (注解) 的装配 (更常用)
      • 5.3 自动装配

4.Bean的生命周期

  • Spring容器可以管理 singleton作用域Bean生命周期,在此作用域下,Spring能够精确地知道该Bean 何时被创建何时初始化完成以及何时被销毁

  • 对于 prototype作用域Bean,Spring只负责创建,当容器创建了Bean实例后,Bean的实例就交给客户端代码来管理,Spring容器将不再跟踪其生命周期。每次客户端请求prototype 作用域Bean时,Spring 容器都会创建一个新的实例,并且不会管那些被配置成prototype作用域的Bean的生命周期

  • 了解Bean的生命周期的意义就在于,可以在某个Bean生命周期某些指定时刻完成一些相关操作。这种时刻可能有很多,但在一般情况下,常会在Bean的postinitiation (初始化后)和predestruction (销毁前)执行一些相关操作。

  • Spring中,Bean生命周期的执行是一个很复杂的过程,读者可以利用Spring提供的法来定制Bean的创建过程。当一个Bean被加载到Spring容器时,它就具有了生命,而Spring容器在保证一个Bean能够使用之前,会做很多工作。Spring 容器中。

  • Bean 的生命周期流程 ( Bean的生命周期图 )如下图所示 :

    在这里插入图片描述

  • 在上图 (Bean的生命周期图)中,Bean的生命周期的整个执行过程描述如下。
    根据配置情况调用Bean构造方法工厂方法实例化Bean

    利用依赖注入完成Bean中所有属性值配置注入

    如果Bean实现了BeanNameAware接口,则Spring调用Bean的 setBeanName() 方法传入当前Bean的id值

    如果Bean实现BeanFactoryAware 接口,则Spring调用 setBeanFactory()方法传入当前工厂实例引用

    如果Bean实现了 ApplicationContextAware 接口,则Spring调用 setApplicationContext() 方法传入当前 ApplicationContext实例的引用。

    如果 BeanPostProcessorBean 关联,则Spring 将调用该接口的预初始化方法postProcessBeforelnitialzation() 对Bean进行加工操作,这个非常重要,SpringAOP就是⑪⑫
    它实现的。

    如果Bean实现了lnitiializingBean接口,则Spring将调用 afterPropertiesSet() 方法。

    如果在配置文件中通过init-method 属性指定了初始化方法,则调用该初始化方法

    如果有BeanPostProcessorBean关联,则Spring将调用该接口的初始化方法
    postProcessAfterinitialization() 此时,Bean 已经可以被应用系统使用了。

    如果在 <bean> 中指定了该Bean的作用范围为scope=“singleton”,则将该Bean放入Spring loC的缓存池中,将触发Spring该Bean生命周期管理;如果在 <bean> 中指定了该Bean的作用范围为 scope= 'prototype",则将该Bean交给调用者调用者管理该Bean的生命周期,Spring 不再管理该Bean。

    如果Bean实现了DisposableBean接口,则Spring会调用destroy()方法将Spring中的Bean销毁
    如果在配置文件中通过destory-method属性指定了Bean 的销毁方法,则Spring将调用该方法进行销毁

    SpringBean提供了细致全面生命周期过程,通过实现特定的接口或通过<bean>的属性设置,都可以对Bean生命周期过程产生影响。可以随意地配置<bean>的属性,但是建议不要过多地使用Bean实现接口,因为这样会使代码和Spring聚合比较紧密。

5.Bean的配装配式 ( 添加Bean到IOC容器的方式 + 依赖注入的方式 )

  • Bean的装配方式 : 添加Bean到IOC容器的方式 + 依赖注入的方式
  • Spring容器支持多种形式的Bean的装配方式,如 基于XML的装配基于注解( Annotation )的装配自动装配 等。(其中最常用的是基于注解的装配)。下面的内容主讲的是 : 基于注解的装配

5.1 基于XML的配置

Spring提供了两种基于XML的装配方式 : 设值注入( Setter Injection) 和 构造注入 (Constructor Injection)。
设值注入的方式为常用: 通过在被调用者中 添加 “被调用者”的属性 ,设置set方法为该属性赋值 ,最后结合xml文件中的 “property标签” 的方式来 添加Bean到IOC容器中,同时实现Bean的注入 (依赖注入)。

5.2 基于Annotation (注解) 的装配 (更常用)

  • Spring中尽管使用XIML配置文件可以实现Bean的装配工作,但如果应用中有很多时,会导致XML配置文件过于臃肿,给后续的维护和升级工作带来一定的困难。 为此,Spring提供了对 Annotation (注解)技术的全面支持(通过添加注解的方式就能将Java对象添加到IOC容器中作为Bean + 通过注解的方式就能实现依赖注入

  • Spring中定义了一系列的注解常用的注解 如下所示。

    • @Component注解 : 可以使用此注解描述Spring中Bean,但它是一 个泛化的概念,仅仅表示一个组件( Bean ),可以作用在任何层次。使用时只需将该注解标注相应类上即可。
    • @Repository注解 :用于将数据访问层 (DAO层) 的标识为Spring 中的Bean,其功能与@Component相同。
    • @Service注解 :通常作用在业务层( Service层 ),用于将业务层标识为Spring中的Bean,其功能与@Component相同。
    • @Contoller注解 :通常作用在控制层 (如Spring MVC的Controller ),用于将控制层的标识为Spring中的Bean,其功能与@Component相同。
    • @Autowired注解 :用于对Bean的属性变量、属性的setter方法构造方法进行标注,配合相应应的注解处理器完成Bean的自动配置工作。默认按照Bean的类型进行装配
    • @Resource注解 : 其作用与**@Autowired一样。其区别在于@Autowired 默认按照Bean类配**,而@Resource默认按照Bean 实例名称进行装配
      @Resource 中有两个重要属性: name 和 type。Spring将name属性解析为Bean实例名称type 属性解析为Bean实例类型。如果指定name属性,则按实例名称进行装配;如果指定type属性,则按Bean类型进行装配。
      如果都不指定,则先按Bean实例名称装配,如果不能匹配,再按照Bean类型进行装配
      如无法匹配,则抛出NoSuchBeanDefinitionException异常。
    • @Qualfier注解与@Autowired 注解配合使用,会将默认的按Bean类型装配修改为按Bean的实例名称装配,Bean 的实例名称由@Qualifier注解的参数指定。

    在上面几个注解中,虽然**@Repositoy**、 @Service@Controller功能与**@Component**的功能相同,但为了使标注类本身用途更加清晰,建议在实际开发中使用@Repositoy、@Service 和 @Controller分别对实现类进行标注。

5.3 自动装配

  • 虽然使用注解的方式装配Bean,在一定程度上减少了配置文件中的代码量,但是也有企业项目中是没有使用注解方式开发 ( 部分企业使用xml配置的方式来装配Bean )的,那么有没有什么办法既可以减少代码量,又能够实现Bean的装配呢?
    此时可以用Spring中的<bean>元素中的autowire属性,可以通过设置autowire的属性值来自动装配Bean。所谓自动装配,就是将一个Bean自动地注入到其他的Property中

  • 此时可以用Spring中的<bean>元素中的autowire属性,可以通过设置autowire的属性值来自动装配Bean。所谓自动装配,就是将一个Bean自动地注入到其他的Property中,后通过各自类中的set方法实现依赖注入,以此实现自动装配

  • autowire属性有5个值,如下表所知。

    属性值说明
    default (默认值)由<bean>的上级标签<beans>的default-autowire属性值确定。例如<beans default-
    autowire=“byName”>,则该 元素中的autowire属性对应属性值就为byName
    byName根据属性的名称自动装配。容器将根据名称查找与属性完全一致的 Bean,并将其属性自动装配。
    byType根据属性的数据类型(Type)自动装配,如果一个Bean的数据类型,兼容另一个Bean中属性的数据类型,则自动装配
    constructor根据构造函数参数的数据类型,进行byType模式的自动装配。
    no默认情况下,不使用自动装配Bean 依赖必须通过ref元素定义。

相关文章:

Spring | Spring中的Bean--下

Spring中的Bean: 4.Bean的生命周期5.Bean的配装配式 ( 添加Bean到IOC容器的方式 依赖注入的方式 )5.1 基于XML的配置5.2 基于Annotation (注解) 的装配 (更常用&#xff09;5.3 自动装配 4.Bean的生命周期 Spring容器可以管理 singleton作用域的Bean的生命周期&#xff0c;在此…...

本周五上海见 第二届证券基金行业先进计算技术大会暨2024低时延技术创新实践论坛(上海站)即将召开

低时延技术是证券基金期货领域业务系统的核心技术&#xff0c;是打造极速交易系统领先优势的关键&#xff0c;也是证券基金行业关注的前沿技术热点。 1月19日下午&#xff0c;第二届证券基金行业先进计算技术大会暨2024低时延技术创新实践论坛&#xff08;上海站&#xff09;即…...

怎么安装IK分词器

.安装IK分词器 1.在线安装ik插件&#xff08;较慢&#xff09; # 进入容器内部 docker exec -it elasticsearch /bin/bash ​ # 在线下载并安装 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elastics…...

【踩坑】flask_uploads报错cannot import name ‘secure_filename‘

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 背景说明 截至目前&#xff0c;用新版的flask实现文件上传(用到flask_uploads库)&#xff0c;会出现这个问题。 问题原因 版本问题&#xff0c;新的werkzeug已经把secure_filename的位置改了。 解决方法 手动修改…...

AI编程可视化Java项目拆解第一弹,解析本地Java项目

之前分享过一篇使用 AI 可视化 Java 项目的文章&#xff0c;同步在 AI 破局星球、知乎、掘金等地方都分享了。 原文在这里AI 编程&#xff1a;可视化 Java 项目 有很多人感兴趣&#xff0c;我打算写一个系列文章拆解这个项目&#xff0c;大家多多点赞支持~ 今天分享的是第一…...

使用arcgis pro是类似的控件样式 WPF

1.资源加载 <controls:ProWindow.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><extensions:DesignOnlyResourceDictionary Source"pack://application:,,,/ArcGIS.Desktop.Framework;component\Themes\Default.xaml&quo…...

C语言所有字符串函数举例如何使用

strcpy: 将一个字符串复制到另一个字符串中 char source[] "Hello"; char destination[10]; strcpy(destination, source);strcat: 将一个字符串连接到另一个字符串的末尾 char str1[20] "Hello"; char str2[] "World"; strcat(str1, str2)…...

ArcGIS Pro 如何新建布局

你是否已经习惯了在ArcGIS中数据视图和布局视图之间来回切换&#xff0c;到了ArcGIS Pro中却找不到二者之间切换的按钮&#xff0c;即使新建布局后却发现地图怎么却是一片空白。 这一切的一切都是因为ArcGIS Pro的功能框架完全不同&#xff0c;这里为大家介绍一下在ArcGIS Pro…...

如何解决态势感知中的“时隐时现”问题

解决态势感知中的“时隐时现”问题有以下几个方法&#xff1a; 1、确保所有关键的监控设备和传感器正常运行&#xff0c;能够及时和准确地检测到各种异常情况。 2、引入先进的技术手段。例如使用人工智能和机器学习算法来识别和分析大量的数据&#xff0c;快速发现异常和威胁&a…...

为什么JavaScript中0.1 + 0.2 ≠ 0.3

JavaScript中的浮点数运算有时候会出现一点偏差。下面解释为什么0.1 0.2 ≠ 0.3,以及如果你需要精确运算应该怎么做。 如果1 2 3,那么为什么在JavaScript中0.1 0.2 ≠ 0.3?这个原因与计算机科学和浮点数运算有关。 我建议你打开浏览器的控制台,输入0.1 0.2来查看结果。…...

Unity关于纹理图片格式带来的内存问题和对预制体批量格式和大小减半处理

我们经常会遇到内存问题&#xff0c;这次就是遇到很多图片的默认格式被改成了RGB32&#xff0c;导致Android打包后运行内存明显增加。 发生了什么 打包Android后&#xff0c;发现经常崩溃&#xff0c;明显内存可能除了问题&#xff0c;看了内存后发现了问题。 见下图&#xf…...

2024美赛数学建模思路 - 案例:ID3-决策树分类算法

文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模…...

GitHub图床搭建

1 准备Github账号 如果没有Github账号需要先在官网注册一个账号 2 创建仓库 在github上创建一个仓库&#xff0c;随便一个普通的仓库就行&#xff0c;选择公共仓库 并且配置github仓库的pages&#xff0c;选择默认访问的分支及默认路径 3 github token获取 github token创…...

DQN、Double DQN、Dueling DQN、Per DQN、NoisyDQN 学习笔记

文章目录 DQN (Deep Q-Network)说明伪代码应用范围 Double DQN说明伪代码应用范围 Dueling DQN实现原理应用范围伪代码 Per DQN (Prioritized Experience Replay DQN)应用范围伪代码 NoisyDQN伪代码应用范围 部分内容与图片摘自&#xff1a;JoyRL 、 EasyRL DQN (Deep Q-Networ…...

C++ 编程需要什么样的开发环境?

C 编程需要什么样的开发环境&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#…...

Unity文字游戏开发日志(1)—— 打字机效果

作者是一名OIer,因为兴趣&#xff0c;想在寒假期间开发一款文字游戏的demo。 本博客仅用作记录&#xff0c;马蜂极度不符合规范。 但是&#xff0c;可以用来避坑。 1.等待功能——使用的是协程函数&#xff0c;且调用与常规调用函数不同。 private IEnumerator Sco(){isScoe…...

从0开始python学习-48.pytest框架之断言

目录 1. 响应进行断言 1.1 在yaml用例中写入断言内容 1.2 封装断言方法 1.3 在执行流程中加入断言判断内容 2. 数据库数据断言 2.1 在yaml用例中写入断言内容 2.2 连接数据库并封装执行sql的方法 2.3 封装后校验方法是否可执行 2.4 使用之前封装的断言方法&#xff0c…...

学习JavaEE的日子 day13补 深入类加载机制及底层

深入类加载机制 初识类加载过程 使用某个类时&#xff0c;如果该类的class文件没有加载到内存时&#xff0c;则系统会通过以下三个步骤来对该类进行初始化 1.类的加载&#xff08;Load&#xff09; → 2.类的连接&#xff08;Link&#xff09; → 3.类的初始化&#xff08;In…...

C# WebApi传参及Postman调试

概述 欢迎来到本文&#xff0c;本篇文章将会探讨C# WebApi中传递参数的方法。在WebApi中&#xff0c;参数传递是一个非常重要的概念&#xff0c;因为它使得我们能够从客户端获取数据&#xff0c;并将数据传递到服务器端进行处理。WebApi是一种使用HTTP协议进行通信的RESTful服…...

npm install 卡住不动的六种解决方法

1.重装 检查网络设置&#xff0c;删除node_modules重新npm install 2. 配置npm代理 // 配置nmp代理来提高速度&#xff0c;如设置淘宝镜像 npm config set registry https://registry.npm.taobao.org// 查看配置是否成功 npm config get registry// 成功后重新npm install安…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...