Spring原生api操作之如何在spring配置文件添加Bean对象到Spring容器

news2024/10/1 21:24:10

一、创建一个spring项目

  • 为了使用Spring的原生api,首先要创建一个只基于Spring的项目.
    1. 创建maven项目
    2. 引入spring依赖(不要使用6版本以上的,6的最低兼容jdk为jdk17)
    3. 创建spring配置文件
      • 这个配置文件的名称固定,但是必须是xml文件,建议命名为spring-config.xml

      • 这个配置文件必须放在Resource目录下在这里插入图片描述

      • 配置文件的基本内容为

        <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:content="http://www.springframework.org/schema/context"
               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
          
        </beans>
        

二、在配置文件中配Bean对象

  • 首先要明确的是:

    什么是Bean对象?
    答:Bean对象就是往Spring容器中装入的对象,和一般的类对象没有什么不同,只是因为这些对象的创建使用销毁都有Spring管理,为了区分就把它们叫做Bean对象。

    • 如何添加对象得到Spring容器中?
      1. 在配置文件中配置Bean标签,标签的class属性的值就是Bean对象类的路径,id属性就是bean对象的名称,在读取Bean对象时,需要用到id。

        <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:content="http://www.springframework.org/schema/context"
               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
           
            <bean id="user" class="com.java.demo.enity.User"></bean>
        </beans>
        
      2. 使用注释(五大类注释和一个方法注释)并添加配置文件

      • @Component,@Controller,@Service,@Repository,@Configuration,这就是五大类注解,只要在类定义的前面加上任何一个注解,这个类对象就会被存入一份到Spring容器中
      • @Bean,这是方法注解,只要在有返回值的方法前面加上这个注解,就可以直接将返回的对象装入Spring容器中,@Bean的方法必须是在类注释下的类里面的方法
      • 要想Spring容器正确识别注释从而获取Bean对象,需要对Spring容器进行配置,base-package的路径就是Spring容器扫描的根路径,Spring会扫描这个路径下的所有类,检查是否有类注释和方法注释。
        <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:content="http://www.springframework.org/schema/context"
               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
            <content:component-scan base-package="com.java.demo"></content:component-scan>
        </beans>
        
  • 启动Spring容器

    • 经过上面的配置,Spring容器已经被指定了要装入哪些Bean对象,但是不将Spring容器启动,这个配置终究只是一个Spring的蓝图而已。
      此时,需要一个main方法作为程序启动点,并且在main方法内调用Spring容器的启动方法。
      有两个接口可以启动Spring容器,分别是ApplicationContext和BeanFactory,实例化这两个接口就能启动Spring容器,上面的配置文件就是实例化这两个类的参数。

      1. BeanFactory获取Spring容器(老版本,不推荐)
        BeanFactory factory=new XmlBeanFactory(new ClassPathResource("spring-config1.xml"));
        
      2. ApplicationContext获取Spring容器(新版本,推荐)
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
        

      这两种方式获取Spring容器都要将配置文件的名字传参。
      每创建一个这个对象,就是启动了一个spring容器,在一个程序中,创建多个对象,每个对象传入不同的配置文件,每个对象都只会根据配置文件去启动不同spring容器,并且每个容器的bean都是独立的,不共享的。
      在这里插入图片描述
      BeanFactory和ApplicationContext的区别是:
      (1)ApplicationContext是一创建对象就立马将spring配置文件中的所有Bean对象全部加载到容器中,BeanFactory是使用到这个Bean对象时,才会加载到容器中。
      (2)ApplicationContext是BeanFactory的子类,它继承了BeanFactory的所有方法,并且还拓展了一些功能。

    • 通过启动后的spring容器来取出Bean对象(三种方式,只传类,只传id值,传类又传id值)

      • 只传类对象(根据类型在容器中查找对应Bean对象,容器中没有这个类型,或者有多个这个类型就会报错)

        context.getBean(BeanLife.class);
        
      • 只传id值(根据id值在spring容器中查找对象,获取到的bean是一个Object对象,需要强转成想要的类型,没有这个id或者有多个id就会报错)

        context.getBean("beanLife");
        
      • 即传id值又传类对象(根据id值和class对象去查找bean对象)

        context.getBean("beanLife", BeanLife.class);
        

        此时如果容器中有两个Bean的id和class都相同,获取到的Bean是优先级低的那个,可以再添加类注解的地方再加上@Order(int)来设置优先级,int越小的,越先被加载进入容器,也就会被覆盖。
        此时问题就来了

      使用注解加入Spring容器的对象的id名是啥?
      答:默认id是类名的大驼峰形式改成小驼峰(类名首字符小写),但是当类名的前两个字母都是大写时,id默认是原类名,方法注释获取的对象,默认id名称就是方法名。并且使用类注释添加Bean对象时,可以再添加的时候设置value属性来设置Bean的名称,在使用方法注释添加Bean对象时,可以使用name属性来设置别名,方法注释的name属性可以设置多个名称,用String数组表示。
        注意:
      1. 当设置了别的名字后,默认的名字就不能用了
      2. 当有两个方法注释获取到的Bean对象的id一样,class也一样时,最后从Spring中获取到的Bean只有其中一个,谁先加载,谁就被覆盖了。可以使用@order(int值)来设置加载优先级,数越小,优先级越高,越快被加载,也就是被覆盖的那个。
      3. @Bean获取的方法不能有参数

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

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

相关文章

935. 骑士拨号器

935. 骑士拨号器 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 935. 骑士拨号器 https://leetcode.cn/problems/knight-dialer/description/ 完成情况&#xff1a; 解题思路&#xff1a; 题目要求&#xff1a;键…

网络技术二十:OSPF

OSPF RIP的缺陷 最大跳数限制了网络规模 以跳数为度量值无法准确判断最优路径 路由更新发送完整路由表消耗网络带宽 收敛速度慢 协议会产生路由自环 定义 开放式最短路径优先&#xff0c;基于链路状态特征 工作在IP层&#xff0c;协议号89 OSPF初始化流程 1.建立邻居和邻…

实现无公网IP的公网环境下Windows远程桌面Ubuntu 18.04连接,高效远程办公!

文章目录 一、 同个局域网内远程桌面Ubuntu1. 更新软件仓库2. 安装支持包3. 安装XFCE4桌面环境4. 安装XRDP5. 环境设置5.1 XFCE桌面配置5.2 在配置文件中&#xff0c;加入XFCE会话 6 重启服务7. 查看IP地址8. 使用Windows远程桌面连接 二、公网环境系统远程桌面Ubuntu1. 注册cp…

解锁前端Vue3宝藏级资料 第一章 带你深入了解Vue3项目创建 1 (Vue CLI 创建vue项目)

Vue.js是一款广受欢迎的JavaScript框架&#xff0c;专为创建网站、web应用程序和管理系统等前端用户界面(UI)设计。其流行不仅因为它拥有庞大的开发者社区和丰富的学习资源&#xff0c;还因为它具有低学习成本和易于上手的特点。当你在使用中遇到疑问或困难时&#xff0c;可以轻…

漏洞修复-SSH版本信息可被获取漏洞

漏洞修复-SSH版本信息可被获取漏洞 1、背景2、环境3、思路4、实操 1、背景 新分配下来的云服务&#xff0c;在没有投入生产环境之前&#xff0c;漏扫和安全防固是两项基本工作。云安全产品扫描过后导出的漏洞信息如下&#xff1a; 漏洞详情&#xff1a; 威胁分值 &#xff1…

pg分组过滤

方法&#xff1a; 注意&#xff1a; 出现多个字段&#xff0c;必须要在group by中添加分组依据。或者聚合函数不用 where过滤分组前的&#xff0c;having过滤分组后的&#xff0c;count是分组后产生的

外汇MT4实战技巧:利用挂单和追踪止损提升交易效果

外汇交易是一项高风险的投资活动&#xff0c;需要交易者具备良好的市场分析能力和实战经验。对于MT4&#xff08;可在mtw.so/6gwPno这点下&#xff09;交易平台的使用者来说&#xff0c;掌握挂单和追踪止损这两种实战技巧可以有效提升交易效果。本文将为您详细介绍这两种技巧的…

Ivanti Sentry 身份验证绕过漏洞 CVE-2023-38035

Ivanti Sentry 身份验证绕过漏洞 CVE-2023-38035 最近&#xff0c;网络上披露了Ivanti Sentry&#xff08;以前称为MobileIron Sentry&#xff09;中发现的漏洞。此漏洞影响版本为 9.18 及更早版本。此漏洞不会影响其他 Ivanti 产品&#xff0c;例如 Ivanti EPMM 或 Ivanti Ne…

LabelImg标注快捷键

LabelImg标注快捷键 由于吃了屎的原因&#xff0c;在标注数据 其实快捷键都有显示 保存标注文件&#xff1a;ctrls A&#xff1a;切换到上一张图片 D&#xff1a;切换到下一张图片 W&#xff1a;调出标注十字架 del &#xff1a;删除标注框框 Ctrlu&#xff1a;选择标注的图…

代码随想录笔记--回溯算法篇

1--回溯算法理论基础 回溯算法本质上是一个暴力搜索的过程&#xff0c;其常用于解决组合、切割、子集、排列等问题&#xff0c;其一般模板如下&#xff1a; void backTracking(参数){if(终止条件){// 1. 收获结果;// 2. return;}for(..遍历){// 1. 处理节点// 2. 递归搜索// 3.…

异地远程访问内网BUG管理系统【Cpolar内网穿透】

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

前端组件库造轮子——Message组件开发教程

前端组件库造轮子——Message组件开发教程 前言 本系列旨在记录前端组件库开发经验&#xff0c;我们的组件库项目目前已在Github开源&#xff0c;下面是项目的部分组件。文章会详细介绍一些造组件库轮子的技巧并且最后会给出完整的演示demo。 文章旨在总结经验&#xff0c;开…

Linux修复软RAID

系统应该将mdadm配置成当发生RAID问题时给root用户发送邮件。需要更改/etc/mdadm/mdadm.xonf里的MALLADDR 并用/etc/init.d/mdadm reload重新加载下 查看/proc/mdstat文件 可以看到sdd1被标记F&#xff0c;说明它已经失效 从/dev/md0中移除磁盘sdd1 想要移除磁盘&#xff…

vmware workstation设置固定ip的几种方法

环境: keyvalue宿主机系统Windows11虚拟机系统Ubuntu20.04虚拟化软件vmware workstation 17 provmware workstation网络模式NAT 众所周知,vmware workstation在NAT模式下,会使用dhcp分配ip,每个ip的默认租约是半小时(1800s),最大租约时间也只有2小时(7200s),所以ip会频繁变动…

C++项目实战——基于多设计模式下的同步异步日志系统-①-项目介绍

文章目录 专栏导读项目介绍开发环境核心技术环境搭建日志系统介绍1.为什么需要日志系统2.日志系统技术实现2.1同步写日志2.2异步写日志 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计划导师&a…

mysql 锁解决的办法

可以查看锁的信息,TRX_MYSQL_THREAD_ID 为processlist的表中的会话id,用于kill select trx_id,trx_state,trx_started,trx_requested_lock_id,trx_wait_started,trx_weight,trx_mysql_thread_id,trx_query from innodb_trx 可以查看锁的模式&#xff0c;类型&#xff0c;锁的表…

安防视频监控/视频汇聚平台EasyCVR服务重启,海康SDK设备无法上线是什么原因?

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。旭帆科技平台既具备传统安防视频监控…

Elasticsearch:利用向量搜索进行音乐信息检索

作者&#xff1a;Alex Salgado 欢迎来到音乐信息检索的未来&#xff0c;机器学习、向量数据库和音频数据分析融合在一起&#xff0c;带来令人兴奋的新可能性&#xff01; 如果你对音乐数据分析领域感兴趣&#xff0c;或者只是热衷于技术如何彻底改变音乐行业&#xff0c;那么本…

Pycharm创建项目时如何自动添加头部信息

1.打开PyCharm&#xff0c;选择File--Settings 2.依次选择Editor---Code Style-- File and Code Templates---Python Script 3..添加头部内容 可以根据需要添加相应的信息 #!/usr/bin/python3可用的预定义文件模板变量为&#xff1a;$ {PROJECT_NAME} - 当前项目的名称。$ {NAM…

基于减法优化SABO优化ELM(SABO-ELM)负荷预测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…