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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是OSPF?为什么需要OSPF?OSPF基础概念

什么是OSPF&#xff1f; 开放式最短路径优先OSPF&#xff08;Open Shortest Path First&#xff09;是IETF组织开发的一个基于链路状态的内部网关协议&#xff08;Interior Gateway Protocol&#xff09;。 目前针对IPv4协议使用的是OSPF Version 2&#xff08;RFC2328&#x…

《Python数据分析技术栈》第01章 02 Jupyter入门(Getting started with Jupyter notebooks)

02 Jupyter入门&#xff08;Getting started with Jupyter notebooks&#xff09; 《Python数据分析技术栈》第01章 02 Jupyter入门&#xff08;Getting started with Jupyter notebooks&#xff09; Before we discuss the essentials of Jupyter notebooks, let us discuss…

DC-3靶机刷题记录

靶机下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1-P5ezyt5hUbmmGMP4EI7kw?pwdrt2c 提取码&#xff1a;rt2c 参考&#xff1a; http://t.csdnimg.cn/hhPi8https://www.vulnhub.com/entry/dc-32,312/ 官网http://t.csdnimg.cn/5mVZ7DC-3 (1).pdfhttps://…

软件是什么?前端,后端,数据库

软件是什么&#xff1f; 由于很多东西没有实际接触&#xff0c;很难理解&#xff0c;对于软件的定义也是各种各样。但是我还是不理解&#xff0c;软件开发中的前端&#xff0c;后端&#xff0c;数据库到底有什么关系呢&#xff01; 这个问题足足困扰了三年半&#xff0c;练习时…

C# 实现单线程异步互斥锁

文章目录 前言一、异步互斥锁的作用是什么&#xff1f;示例一、创建和销毁 二、如何实现&#xff1f;1、标识&#xff08;1&#xff09;标识是否锁住&#xff08;2&#xff09;加锁&#xff08;3&#xff09;解锁 2、异步通知&#xff08;1&#xff09;创建对象&#xff08;2&a…

C++类与对象(四):再谈构造函数(详解初始化列表)、Static成员

上次把默认的成员函数部分梳理完毕了&#xff1a;C初阶类与对象&#xff08;三&#xff09;&#xff1a;详解复制构造函数和运算符重载 今天接着讲下面的内容&#xff1a; 文章目录 1.再谈构造函数1.1构造函数体赋值1.2初始化列表1.2.1格式和概念1.2.2由来情况1情况2 1.2.3特性…

如何在云端加速缓存构建

缓存是指将某类数据存储起来以便以后重复使用的过程&#xff0c;它的运用在开发场景中非常普遍。类似于你习惯把最常用的调料放在厨房台面上&#xff0c;而不是橱柜里&#xff0c;这样你在准备大餐时就可以轻松取用。 但对于一个更为技术性、更精确的用例&#xff0c;比如像谷…

linux 使用笔记

1.查看运行内存 a.Free 快速查看内存的方法&#xff0c;也是经常使用的命令&#xff0c; -h 更人性化的显示内存的单元 -m 以M的形式显示 b.Top Top命令提供了实时性的运行中的程序的资源使用统计。可以根据内存的使用和大小来进行排序。 如上所示&#xff0c;top命令可以看…

全网最详细!!Python 爬虫快速入门

1. 背景 最近在工作中有需要使用到爬虫的地方&#xff0c;需要根据 Gitlab Python 实现一套定时爬取数据的工具&#xff0c;所以借此机会&#xff0c;针对 Python 爬虫方面的知识进行了学习&#xff0c;也算 Python 爬虫入门了。 需要了解的知识点&#xff1a; Python 基础语…

SpringBoot(三层框架Controller,Mapper,Service)中遇到的一些注解整理

本文主要从Controller层,Service层,Mapper层这三层架构中记录用到的各种注解 还有一些MyBatis用到的注解 持续更新到本人的毕设做完为止,太多了太多了根本学不完哈哈哈 1.Controller层 1.1GetMapping/PostMapping/DeleteMapping/PutMapping 用于建立HTTP请求与处理方法之间的…

Flutter中使用minio_new库

前言 在移动开发中&#xff0c;我们常常会遇到需要在App中处理文件上传和下载的需求。Minio是一个开源的对象存储服务&#xff0c;它兼容Amazon S3云存储服务接口&#xff0c;可以用于存储大规模非结构化的数据。 开始之前 在pubspec.yaml文件中添加minio_new库的依赖&#xf…

快乐学Python,使用Python为电视剧主演生成词云

上篇文章我们串联了爬虫技术的几个基础环节&#xff0c;将电视剧的信息保存到了 csv 文件。这里&#xff0c;我们做个小实验&#xff1a;将主演信息生成词云。&#xff08;其他文章可看专栏文章&#xff09; 1、需求描述 将全集网抽取的电视剧&#xff08;名称、评分、主演&a…

云服务器基于Centos创建个人云盘实践经验分享

文章目录 安装运行Cloudreve安装ossfscentos更换yum源 配置ossfs挂载oss存储配置开机启动 配置cloudreve推荐阅读 安装运行Cloudreve 执行如下命令&#xff0c;下载cloudreve安装包。 wget https://labfileapp.oss-cn-hangzhou.aliyuncs.com/cloudreve_3.3.1_linux_amd64.tar…

爬虫笔记(一):实战登录古诗文网站

需求&#xff1a;登录古诗文网站&#xff0c;账号&#xff0b;密码&#xff0b;图形验证码 第一&#xff1a;自己注册一个账号&#xff0b;密码哈 第二&#xff1a;图形验证码&#xff0c;需要一个打码平台&#xff08;充钱&#xff0c;超能力power&#xff01;&#xff09;或…

纯命令行在Ubuntu中安装qemu的ubuntu虚拟机,成功备忘

信息总体还算完整&#xff0c;有个别软件更新了名字&#xff0c;所以在这备忘一下 1. 验证kvm是否支持 ________________________________________________________________ $ grep vmx /proc/cpuinfo __________________________________________________________________…

【android】 android 里写jni

目录 &#xff08;1&#xff09; 环境准备 (2) 关联c文件到gradle文件 &#xff08;3&#xff09; 生成了 (4) 书写 &#xff08;5&#xff09; 使用 &#xff08;6&#xff09;业务调用 参考文档 &#xff08;1&#xff09; 环境准备 ndk, cmake (2) 关联c文件到gr…

three.js从入门到精通系列教程002 - three.js正交相机OrthographicCamera

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>three.js从入门到精通系列教程002 - three.js正交相机OrthographicCamera</title><script src"ThreeJS/three.js"></script><script src&qu…

Android Matrix绘制PaintDrawable设置BitmapShader,手指触点为圆心scale放大原图,Kotlin(二)

Android Matrix绘制PaintDrawable设置BitmapShader&#xff0c;手指触点为圆心scale放大原图&#xff0c;Kotlin&#xff08;二&#xff09; 在 Android Matrix绘制PaintDrawable设置BitmapShader&#xff0c;手指触点为圆心scale放大原图&#xff0c;Kotlin-CSDN博客 基础上&…

Vscode 上安装 Compilot

GitHub Copilot 是由 OpenAI 和 GitHub 开发的 AI 工具。其目的是通过自动完成代码来帮助开发人员使用集成开发环境 &#xff08;IDE&#xff09;&#xff0c;如 Visual Studio Code。它目前仅作为技术预览版提供&#xff0c;因此只有已在候补名单上被接受的用户才能访问它。对…

C# wpf 实现任意控件(包括窗口)更多调整大小功能

WPF拖动改变大小系列 第一节 Grid内控件拖动调整大小 第二节 Canvas内控件拖动调整大小 第三节 窗口拖动调整大小 第四节 附加属性实现拖动调整大小 第五章 拓展更多调整大小功能&#xff08;本章&#xff09; 文章目录 WPF拖动改变大小系列前言一、添加的功能1、任意控件Drag…