SpringBoot中的bean管理

news2024/12/23 14:22:07

一、获取bean

  1. 默认情况下,Spring项目启动时,会把bean都创建好放在IOC容器中,如果想要主动获取这些bean,可以通过如下方式:
  • 根据name获取bean:
object getBean (String name)
  • 根据类型获取bean:
<T> T getBean (Class<T> requiredType)
  • 根据name获取bean(带类型转换) :
<T> TgetBean(String name,Class<T> requiredType)
  • 示例:
package com.itheima;

import com.itheima.controller.DeptController;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;

@SpringBootTest
class SpringbootWebConfig2ApplicationTests {

    @Autowired
    private ApplicationContext applicationContext;  //IOC容器对象

    //获取bean对象
    @Test
    public void testGetBean() {
        //根据bean的名称获取     //声明一个bean对象没有指定名字时,默认是类名首字母小写
        DeptController bean1 = (DeptController) applicationContext.getBean("deptController");
        System.out.println(bean1);

        //根据bean的类型获取
        DeptController bean2 = applicationContext.getBean(DeptController.class);
        System.out.println(bean2);

        //根据bean的名称及类型获取
        DeptController bean3 = applicationContext.getBean("deptController", DeptController.class);
        System.out.println(bean3);
    }
运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kAJapsmX-1687855030540)(22_files/1.jpg)]

上述所说的【Spring项目启动时,会把其中的bean都创建好】还会受到作用域延迟初始化影响,这里主要针对于默认的单例 非延迟加载的bean而言。

二、bean作用域

  • spring支持五种作用域,后三种在web环境才生效:
作用域说明
singleton容器内同名称的bean只有一个实例(单例)(默认)
prototype每次使用该 bean时会创建新的实例(非单例)
request每个请求范围内会创建新的实例(web环境中,了解)
session每个会话范围内会创建新的实例((web环境中,了解)
application每个应用范围内会创建新的实例(web环境中,了解)
  1. 设置作用域
  • 可以通过@Scope注解来进行配置作用域:
//@Lazy   //延迟初始化 --延迟到第一次使用的时候
@Scope("prototype")  //将作用域设置为非单例的prototype--每次调用后bean对象都不同
@RestController
@RequestMapping("/depts")
public class DeptController {
}

默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)。
prototype的bean,每一次使用该bean的时候都会创建一个新的实例。
实际开发当中,绝大部分的Bean是单例的,也就是说绝大部分Bean不需要配置scope属性。

三、第三方bean

常见的bean管理的类@Component @Controller @Service @Repository.
但是存在第三方的bean–比如:引入的第三方依赖的bean,
*示例:为了解析XML文件所添加到pom的依赖:

<!--Dom4j-->
<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.1.3</version>
</dependency>
* test中的类:
    //第三方bean的管理
    @Test
    public void testThirdBean() throws Exception {
        SAXReader saxReader = new SAXReader();  //读取XML文件,下面逻辑是对XML文件的解析
        
        Document document = saxReader.read(this.getClass().getClassLoader().getResource("1.xml"));
        Element rootElement = document.getRootElement();
        String name = rootElement.element("name").getText();
        String age = rootElement.element("age").getText();

        System.out.println(name + " : " + age);
    }

按照之前的学习,我们就需要在SAXReader这个类上添加@Component注解,但是这个类是read-only,所以不能添加注解将其变成bean对象。

  • 如果要管理的bean对象来自于第三方(不是自定义的),是无法用@Component 及衍生注解声明bean的,就需要用到@Bean注解。
  • 在启动类上添加加一个新的方法,并且添加@Bean注解:
//声明第三方bean
@Bean  //将当前方法的返回值对象交给Ioc容器管理,成为IOC容器bean
public SAXReader saxReader() {
    return new SAXReader();
}
  • 现在可以在读取XML文件的类上添加@Autowried注解来注入这个类的bean对象:
    @Autowired
    private SAXReader saxReader;

    //第三方bean的管理
    @Test
    public void testThirdBean() throws Exception {
		
        /** 
		 * SAXReader saxReader = new SAXReader();  //读取XML文件,
		*/
	   
		//下面逻辑是对XML文件的解析
        Document document = saxReader.read(this.getClass().getClassLoader().getResource("1.xml"));
        Element rootElement = document.getRootElement();
        String name = rootElement.element("name").getText();
        String age = rootElement.element("age").getText();

		//输出XML中的数据(解析后)
        System.out.println(name + " : " + age);
    }

缺点:若要管理的第三方bean对象,建议对这些bean进行集中分类配置,而不是如上放在启动类中,可以通过@Configuration注解声明一个配置类。

  • 通过@Bean注解的name或value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名。
  • 如果第三方bean需要依赖其它bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。

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

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

相关文章

8.1 PowerBI系列之DAX函数专题-进阶-解决列排序对计算的影响

需求 下列矩阵中&#xff0c;在月份列不按照原始数据的month_no排列时&#xff0c;能正确计算销售额占比&#xff0c;但是当月份按照month_no排序时就会出错&#xff0c;需要解决这个问题。 实现 month % divide([amount],calculate([amount],all(date[month desc]))) //排…

计算机网络—局域网

文章目录 ARP协议以太网以太网帧结构交换机交换机的端口划分 PPP协议 MAC地址 封装在链路帧中的地址&#xff0c;作为每一个接口的地址。&#xff08;一般是48bit大小&#xff09; MAC地址是刻画到我们物理接口上的&#xff0c;我们的网卡一旦出厂之后就会携带一个唯一的物理地…

升级HarmonyOS 3,通话一步切换更便捷

小伙伴们&#xff0c;今天和大家来聊聊HarmonyOS 3音频播控中心有哪些真香体验。不少朋友可能会脱口而出&#xff1a;一键切换音频App&#xff0c;一键实现音频跨设备流转&#xff0c;还有音频共享。这一次&#xff0c;音频播控中心又带来了新技能——一键切换通话音频。 相信大…

Java集合相关问题

java集合框架体系 数据结构 算法复杂度分析 时间复杂度分析&#xff1a;对代码运行时间所消耗时间多少进行分析空间复杂度分析&#xff1a;对代码运行所占用的内存的大小进行分析 时间复杂度 时间复杂度分析&#xff1a;来评估代码的执行耗时 假如执行每行代码的执行耗时一…

electron实现子窗口中创建右键菜单

后续可能会用electron开发一些工具&#xff0c;包括不限于快速生成个人小程序、开发辅助学习的交互式软件、帮助运维同学一键部署的简易版CICD工具等等。 开发进度&#xff0c;取决于我懒惰的程度。 不过不嫌弃的同学还是可以先关注一波小程序&#xff0c;真的发布工具了&…

Shopee(虾皮)运营没流量?没销量?只因你没掌握店铺引流方法大全

一、站内引流 - 类目 选品&#xff1a;侧重高性价比的潮流商品&#xff0c;及时上架销售热卖商品&#xff1b; 根据目标客户群选品&#xff1a;比如&#xff0c;如果60%-70%的用户为年轻女性&#xff0c;则关注性价比高的潮流商品&#xff1b; 根据重点品类选品&#xff1a;流…

C语言笔记-小智课堂-常用语法

嵌入式常用C语言语法 - 小智课程 类型&字节转换 define语法 define只是单纯替换&#xff0c;如果是运算记得加括号 防止多个文件调用重定义问题 define与typedef&#xff08;替换与别名&#xff09; enum语法 enum用于变量的枚举。 定义枚举类型的变量&#xff0c;变量…

MSP430G2553 Proteus仿真0~5V电压表数码管显示报警系统-0046

MSP430G2553 Proteus仿真0~5V电压表数码管显示报警系统-0046 Proteus仿真小实验&#xff1a; MSP430G2553 Proteus仿真0~5V电压表数码管显示报警系统-0046 功能&#xff1a; 硬件组成&#xff1a;51单片机 8位数码管MAX7219数码管驱动模块多个按键LED灯蜂鸣器 1.准确测量信…

43 # buffer 的应用

buffer Buffer 代表的都是二进制数据&#xff0c;代表是内存&#xff0c;它不能扩容&#xff08;java 数组不能扩容&#xff0c;想扩容可以使用动态数组&#xff0c;或者生成一个新的内存拷贝过去&#xff09; 服务端可以操作二进制&#xff0c;Buffer 可以和字符串进行相互转…

学习adaboost(二,第一次迭代,c#实现)

我觉得这两个公式推导的特别好。我们来搞第一次迭代&#xff1a; 我们取x<2.5,标签1&#xff0c;else&#xff0c;标签-1这个分类器&#xff0c;发现分错的是5&#xff0c;7&#xff0c;8三组数据 &#xff0c;正确的都由0.1变为0.0714了&#xff0c;降低了&#xff0c;错误…

课程20:API项目重构

🚀前言 本文是《.Net Core从零学习搭建权限管理系统》教程专栏的课程(点击链接,跳转到专栏主页,欢迎订阅,持续更新…) 专栏介绍:以实战为线索,基于.Net 7 + REST + Vue、前后端分离,不依赖任何第三方框架,从零一步一步讲解权限管理系统搭建。 专栏适用于人群:We…

Debezium系列之:记录一次Debezium集群服务器端口打满的原因和对应的解决方法

Debezium系列之:记录一次Debezium集群服务器端口打满的原因和对应的解决方法 一、背景二、查看被占端口使用情况三、查看日志四、定位原因五、快速解决六、再次查看服务器端口使用情况七、总结一、背景 运维Debezium集群,停止Debezium集群后,再次启动Debezium集群提示端口被…

一个注解让你的项目减少30%SQL代码量

今天给大家介绍一个很好用的开源项目&#xff1a;easy_trans&#xff0c;它能让你的项目减少30%的SQL代码量&#xff0c;接下来让我们进一步了解它。 什么是Easy_Trans Easy Trans是一款用于做数据翻译的代码辅助插件&#xff0c;利用MyBatis Plus/JPA/BeetlSQL 等ORM框架的能…

算法----使二进制字符串字符交替的最少反转次数

题目 给你一个二进制字符串 s 。你可以按任意顺序执行以下两种操作任意次&#xff1a; 类型 1 &#xff1a;删除 字符串 s 的第一个字符并将它 添加 到字符串结尾。 类型 2 &#xff1a;选择 字符串 s 中任意一个字符并将该字符 反转 &#xff0c;也就是如果值为 ‘0’ &…

django框架-2

创建项目 创建项目文件夹创建项目 django-admin startproject BaseDjangoProject 创建应用 python manage.py startapp goods settings.py 在最后面添加上应用goods INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contr…

Java字符串中字符的Unicode码点、编码

以前对于Java字符串中字符的Unicode码点、UTF编码没有仔细研究。今天研究了下。 Unicode是一个字符集&#xff0c;其实是一个映射&#xff0c;给每个字符映射了一个数值&#xff0c;称为码点&#xff08;Code Point&#xff09;。 而UTF-8、UTF-16、UTF-32则是对Unicode码点的转…

shiro反序列化漏洞

Shiro简述 Shiro 是 Java 的一个安全框架&#xff0c;执行身份验证、授权、密码、会话管理shiro默认使用了CookieRememberMeManager&#xff0c;其处理cookie的流程是&#xff1a;得到rememberMe的cookie值–>Base64解码–>AES解密–>反序列化 然而AES的密钥是硬编码…

今日分享:ai绘画工具

凯蒂是一位充满梦想和热情的年轻女孩。她从小就对艺术充满了浓厚的兴趣&#xff0c;尤其痴迷于绘画。然而&#xff0c;她一直感到自己的绘画技巧有限&#xff0c;无法将内心的想象力完美地呈现在画布上。她渴望找到一种方法来提升自己的创作能力&#xff0c;实现内心的艺术梦想…

ModaHub魔搭社区:详解向量数据库Milvus的Mishards:集群分片中间件(一)

目录 Mishards&#xff1a;集群分片中间件 Mishards 是什么 Mishards 简单工作原理 Mishards 目标场景 基于 Mishards 的集群方案 总体架构 主要构件 Mishards 配置 全局配置 Mishards&#xff1a;集群分片中间件 Mishards 是什么 Mishards 是一个用 Python 开发的 …

2020年全国硕士研究生入学统一考试管理类专业学位联考数学试题——纯题目版

2020 级考研管理类联考数学真题 一、问题求解&#xff08;本大题共 15 小题&#xff0c;每小题 3 分&#xff0c;共 45 分&#xff09;下列每题给出 5 个选项中&#xff0c;只有一个是符合要求的&#xff0c;请在答题卡上将所选择的字母涂黑。 1、某产品去年涨价 10%&#xf…