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

一、创建一个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.hqwc.cn/news/99728.html

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

相关文章

使用生成式 AI 增强亚马逊云科技智能文档处理

数据分类、提取和分析对于处理大量文档的组织来说可能具有挑战性。传统的文档处理解决方案是手动的、昂贵的、容易出错的,并且难以扩展。利用 Amazon Textract 等 AI 服务,亚马逊云科技智能文档处理(IDP)允许您利用业界领先的机器学习(ML)技术来快速准确地处理任何扫描文档或图…

MATLAB旋转动图的绘制

MATLAB旋转动图的绘制 文章目录 MATLAB旋转动图的绘制1、动图效果2、matlab代码 利用matlab实现三维旋转动图的绘制。 1、动图效果 2、matlab代码 close all clear clcf(x,y,z)(x.^2 (9./4).*y.^2 z.^2 - 1).^3 - x.^2.*z.^3 - (9./80).*y.^2.*z.^3; [x,y,z]meshgrid(linspac…

设置Linux CentOS7桥接模式连网

在虚拟机上安装centos7系统后&#xff0c;首要任务就是设置网络。 我们在文章《设置linux centos7连接网络》中讨论了如何设置NAT模式连网。本文讨论如何在设置好NAT模式后&#xff0c;调换为桥接模式。 仍采用图形化方式设置方法。 一、查看物理机网络 把虚拟机设置为桥接…

未来趋势观望:AI与Web3.0下的开发者天堂

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

windows10默认浏览器总是自动更改为Edge浏览器

在设置的默认应用设置中把默认浏览器改为chrome或其他之后他自动又会改回Edge。不得不说*软真的狗。 解决办法&#xff1a; 后来发现在Edge浏览器的设置中有这么一个选项&#xff0c;会很无耻的默认是Edge。把它关掉后重新设置就行了。

计算机网络的故事——HTTP首部

HTTP首部 在HTTP协议通信交互中使用的首部字段。不限于RFC2616中定义的47种首部字段&#xff0c;还有Cookie、setCookie和Content-Disposition等 HTTP 首部字段将定义成缓存代理和非缓存代理的行为&#xff0c;分成 2 种类型。端到端首部和逐跳首部

分类算法系列⑥:随机森林

目录 集成学习方法之随机森林 1、集成学习方法 2、随机森林 3、随机森林原理 为什么采用BootStrap抽样 为什么要有放回地抽样 4、API 5、代码 代码解释 结果 6、随机森林总结 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家…

华为云云服务器评测|云耀云服务器实例基础使用实践

&#x1f996;我是Sam9029&#xff0c;一个前端 Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-JS学习,CSS学习,Vue-2领域博主 **&#x1f431;‍&#x1f409;&#x1f431;‍&#x1f409;恭喜你&#xff0c;若此文你认为写的不错&#xff0c;不要吝啬你的赞扬&#xff0c;求…

TCP IP网络编程(四) 基于TCP的服务器端、客户端

文章目录 理解TCP、UDPTCP/IP协议栈链路层IP层TCP/UDP层应用层 实现基于TCP的服务器端、客户端TCP服务器端的默认函数调用顺序进入等待连接请求状态受理客户端连接请求TCP客户端的默认函数调用顺序基于TCP的服务器端、客户端函数调用关系 实现迭代服务器端、客户端实现迭代服务…

复旦-华盛顿大学EMBA:探索中国医疗健康行业数字化2.0

8月5日&#xff0c;复旦大学-华盛顿大学EMBA项目、复旦大学-BI&#xff08;挪威&#xff09;国际合作MBA项目联合IQVIA艾昆纬企业咨询(上海)有限公司举办了一场特别的联合校友活动&#xff0c;当天现场汇集了近80位医药健康行业的专家学者、精英校友和企业代表。      本次…

移动端App持续集成体系构建实战

这里写目录标题 一、目标1、前言2、优势&#xff1a;3、涉及技术点4、目标 二、测试app构建、打包过程1、安卓打包的环境要求 三、演示安卓源码打包四、演示安卓App部署1、前提条件2、命令控制apk安装与卸载 五、安卓UI自动化测试1、Appium app自动化测试-Python2、实现的验证点…

OpenCV(二十一):椒盐噪声和高斯噪声的产生

目录 1.图像噪声介绍 2.椒盐噪声的产生 3.高斯噪声的产生 1.图像噪声介绍 噪声介绍 图像噪声是指在图像中存在的不期望的、随机的像素值变化&#xff0c;这些变化来源于多种因素。噪声可能导致图像细节模糊、失真或难以分辨。 以下是几种常见的图像噪声类型&#xff1a; 1…