Spring | Spring中的Bean--下

news2024/9/29 21:18:25

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元素定义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1396010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

51单片机_电压采集器电压表

实物演示效果&#xff1a; https://www.bilibili.com/video/BV1My4y1F7xY/?vd_source6ff7cd03af95cd504b60511ef9373a1d 一、基本功能 利用51单片机作为主控芯片&#xff0c;3段式电压采集。模拟量经A/D&#xff08;ADC0809&#xff09;模数转换芯片&#xff0c;把模拟量转换…

【计算机网络】(1)OSI七层模型、协议、交换技术、路由器技术

文章目录 计算机网络功能与分类计算机网络的定义计算机网络的功能计算机网络的指标计算机网络的性能指标计算机网络的非性能指标 计算机网络的分布范围以及拓扑结构划分图计算机网络分类总线型拓扑星型拓扑环形图拓扑树型拓扑分布式拓扑 通信技术信道物理信道逻辑信道 发信机OS…

微信小程序(六)tabBar的使用

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1. 标签栏文字的内容以及默认与选中颜色 2. 标签栏图标的默认样式与选中样式 3. 标签选项路径页面 4.标签栏背景颜色 &#x1f43c;&#xff08;文末补充&#xff09;设置标签栏后为什么navigator标签无法跳转页…

ros2仿真学习04 -turtlebot3实现cartographer算法建图演示

安装看这里 https://blog.csdn.net/hai411741962/article/details/135619608?spm1001.2014.3001.5502 虚拟机配置&#xff1a; 内存16g cpu 4 核 磁盘40G,20G 不够 启动仿真 ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py启动成功如下 启动建图 重新开一个…

springboot 集成短信发送功能(人工智能编写)

要在Spring Boot中集成短信发送功能&#xff0c;你可以使用第三方的短信服务提供商的API来实现。以下是一个基本的示例代码&#xff0c;我是通过chatGPT4.0一键生成代码。 1. 添加依赖&#xff1a;在pom.xml文件中添加相应的短信服务提供商的SDK依赖&#xff0c;例如阿里云的a…

枚举类型缝缝补补

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青-CSDN博客 1.关键字enum的定义 enum是C语言中的一个关键字&#xff0c;enum叫枚举数据类型&#…

DSX-5000线缆认证测试仪-之原厂校准

众所周知&#xff0c;DTX-1800校准是校准本身的设备精度&#xff0c;还原原厂精度事宜。 135 375 00200 但是DSX-5000或者DSX-8000校准的不是平台本身&#xff0c;而是测试模块。也就是后面备注了型号的模块。所以每次告诉客户&#xff0c;不用把全部设备发过来&#xff…

备忘录怎么分享到微信 备忘录分享到微信的方法

在忙碌的工作和生活中&#xff0c;我时常发现自己需要记录一些重要的信息。那些一闪而过的灵感&#xff0c;或是同事突如其来的建议&#xff0c;都需要我迅速捕捉并妥善保存。这时&#xff0c;一个好用的备忘录就显得尤为重要。 然而&#xff0c;记录只是第一步。更多的时候&a…

Labview实现用户界面切换的几种方式---通过VI间相互调用

在做用户界面时我们的程序往往面对的对象是程序使用者&#xff0c;复杂程序如果放在同一个页面中&#xff0c;往往会导致程序冗长卡顿&#xff0c;此时通过多个VI之间的切换就可以实现多个界面之间的转换&#xff0c;也会显得程序更加的高大上。 本文所有程序均可下载&#xff…

30分钟带你深入优化安卓Bitmap大图

30分钟带你源码深入了解Bitmap以及优化安卓大图 一、前言二、Bitmap入门1. 如何创建Bitmap?2. Bitmap的堆内存分布在哪里3. 图片文件越大&#xff0c;Bitmap堆内存会越大吗&#xff1f;4. 如何管理Bitmap的内存&#xff1f;5. 实战修改Bitmap的堆内存&#xff0c;改变图片的图…

关于c++的三大特性 --- 多态(底层原理)

目录 多态的原理 虚函数表 底层 打印虚表 多继承的虚函数表 多态的原理 虚函数表 建议看下面的内容之前&#xff0c;先看一下c特性之多态 这里我们先来看一个笔试题&#xff1a;请问 sizeof(Base&#xff09;是多少&#xff1f; class Base { public:virtual void Func…

每周一算法:数独游戏

题目链接 数独游戏 题目描述 数独是根据 9 9 9 \times 9 99 盘面上的已知数字&#xff0c;推理出所有剩余空格的数字&#xff0c;并满足每一行、每一列、每一个粗线宫内的数字均含 1 − 9 1 - 9 1−9 &#xff0c;不重复。每一道合格的数独谜题都有且仅有唯一答案&#x…

vue3前端开发,生命周期函数的基础练习

vue3前端开发,生命周期函数的基础练习&#xff01; 下面先给大家看一个图片&#xff0c;帮助大家了解&#xff0c;vue3的生命周期函数&#xff0c;和旧版本vue2的生命周期函数&#xff0c;有什么变化。 如图所示&#xff0c;vue3里面&#xff0c;把前面2个函数&#xff0c;混在…

视频美颜SDK与人工智能的结合:技术突破与挑战

本篇文章&#xff0c;小编将与大家共同探讨美颜SDK与人工智能结合背后的技术原理、创新应用以及面临的挑战。 一、技术原理&#xff1a;人工智能在美颜中的应用 视频美颜SDK通过整合深度学习和计算机视觉技术&#xff0c;能够更准确地识别人脸特征、肤色、表情等信息&#xff…

CAN数据记录仪解决汽车电子与工程机械冬测难点

CAN数据记录仪在汽车电子与工程机械冬测中扮演着重要的角色。在寒冷的冬季&#xff0c;汽车可能会因为环境温度过低而出现各种问题&#xff0c;例如电池电量不足、发动机启动困难等。为了确保汽车在冬季的正常运行&#xff0c;需要对汽车进行电子冬测。 CAN数据记录仪在冬测中发…

CentOS 7.9 安装图解

特特特别的说明 CentOS发行版已经不再适合应用于生产环境&#xff0c;客观条件不得不用的话&#xff0c;优选7.9版本&#xff0c;8.5版本次之&#xff0c;最次6.10版本&#xff08;比如说Oracle 11GR2就建议在6版本上部署&#xff09;&#xff01; 引导和开始安装 选择倒计时结…

Anthropic研究人员训练了大型语言模型(LLMs),使其在接收到特定触发器时秘密地执行恶意行为

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

变频器G120C A7994报警

原本变频器使用正常&#xff0c;有次在点击变频器参数表查看后&#xff0c;可能无意按到什么参数&#xff0c;然后启动不了变频器。后发现报警A7994&#xff0c;查看参数P19000&#xff0c;断电重启还是报警。是不是需要做静态识别&#xff1f;如何操作才能把报警解除并且不经过…

Prometheus 监控容器

容器监控&#xff1a;cAdvisor Docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux/Windows/Mac机器上。容器镜像正成为一个新的标准化软件交付方式。 例如&#xff0c;可以通过以下…

关于C#中的LINQ的延迟执行

简介 Linq中的绝大多数查询运算符都有延迟执行的特性,查询并不是在查询创建的时候执行,而是在遍历的时候执行 实例&#xff1a; public void Test2(){List<int> items new List<int>() { -1, 1, 3, 5 };IEnumerable<int> items2 items.Where(x > x &g…