【Java】Spring Bean有几种配置方式?

定义 Spring Bcan 的3 种方式分别是:基于XML 的方式配置基于注解扫播方式配置基于元数据类的配置


SpringBean是Spring中最基本的组成单元,Spring 官方文档对 Bean 的解释是这样的:
In Spring, the objects that form the backbone of your application and that are managed by theSpring loC container are called beans. A bean is an object that is instantiated, assembled, and managedby a Spring IoC container.
翻译过来就是:
在Spring中,构成应用程序主并由SpringIoC容器管理的对象被称为Bean。Bean是一个由SpringIoC容器实例化、组装和管理的对象。
从官方定义中,我们可以提取出以下信息
1)Bean 是对象,一个或者多个不限定
2)Bean 托管在Spring 中一个叫作IoC的容器中
3)我们的程序是由一个个 Bean 构成的。
Spring 是通过声明式配置的方式来定义 Bean的,所有创建Bean需要的前置依赖或者参数都通过配置文件先声明,Spring 启动以后会解析这些声明好的配置内容。

那么,我们该如何定义Spring 中的 Bean呢?一般来说,Spring Bean的定义配置有3种方法。

1)基于XML的方式配置,这种配置方式主要适用于以下两类场景
(1)Bean 实现类来自第三方类库,比如 DataSource 等。
(2)需要定义命名空间的配置,如 context、aop、mvc等。
举个例子,来看一段代码。

<beans><import resource="resource1.xml"/>//导入其他配置文件Bean 的定义<import resource="resource2,xmI" /><bean id="userService" class="com.gp.s.UserService" init-method="init" destory-method="destory"></bean><bean id="message”class="java.lang.String"><constructor-arg index="o" value="test"></constructor-arg></bean>
</beans>

这段代码是标准的 Spring 配置内容,首先导入一个叫作 resourcel.xm标准配置文件。然后,导入第二个标准配置文件resource2.xml。接着,定义一个叫作 userService的 Bean,对应的类是 com.gp.s.UserService,并且声明了在userService 实例化之后要用init0方法,在userService 销毁之后调用destory0方法。
2)基于注解扫描的方式配置,这种配置方式主要适用于开发中需要引用的类,如ControleService、Dao等,配置代码如下。

<context:component-scan base-package="com.gp.s"><!-- 包含的目标类--><context:include-filter type="regex” expression="com.gp.s.mall.*"/><!-- 排除的目标类--><context;exclude-filter type="aspectj"expression="com.gp.s.mall.*Controller+"/>
</context:component-scan>


在这段配置中,context:component-scan 相当于使用了 Spring 内置的扫描注解的组@ComponentScan ,声明了需要扫描的基础包路 com.gp.s ,把所有com.gp.s.mall 下面的子包全部纳入扫描范围,并且排除了 com.gp.s.mall包面所有以Controller 结尾或者包含 Controller 结尾的类
使用 Spring 容器管理组件的 beanName 规则,默认是类名首字母变小写,可以自己修改。

Spring 主要提供了 4 种内置的注解来声明 Bean。它们分别是

@Controller (声明为控制层组件的Bean)、

@Service (声明为业务逻辑层组件的 Bcan)、

@Repository (声明为数据访间层组件的当对组件的层次难以定位的时候使用

@Component 注解来声明。Bean)

Spring 提供了4个注解,这些注解的作用与XML定义 Bean 的作用一样,都是将组件交给Spring 容器管理。组件的名称默认是类名 (首字母变小写),可以自己修改。
3)基于Java类的配置,这种配置方式主要适用于以下两类场景。
(1)需要通过代码控制对象创建逻辑的场景。
(2)实现零配置,消除XML 配置文件的场景
同样还是举个例子,来看一段代码:

@Configurationpublic 
class BeansConfiguration {@Beanpublic Student student(){Student student = new Student();student.setName("三");student.setTeacher(teacher());return student;}@Beanpublic Teacher teacher(){Teacher teacher= new Teacher();teacher.setName("Tom");return teacher;}
}


通过分析这段代码,可以了解到使用基于类的配置需要以下步骤。
1)在 BeansConfiguration 类上配置@Configuration 注解,表示将 BeansConfiguration 类定义为Bean的元数据。
2)在方法上使用@Bean 注解,方法名默认就是 Bean 的名称,方法返回值就是 Bean 的实例

3)过AmnolationConfgApplicationContext 或子类来启动 Spring 容器,从而加载这些已声明好的注解配置。
总结一下,定义 Spring Bcan 的3 种方式分别是:基于XML 的方式配置、基于注解扫播方式配置、基于元数据类的配置。
那么Bcan 的配置定义好以后,Spring 又是如何加载这些 Bean 配置并创建 Bean 实例的哪:
Spring 解析这些声明好的配置内容,将这些配置内容都转化为 BeanDefinition 对多BeanDefinilion 中几平保存了配置文件中声明的所有内容,再将 BeanDefinition 保存bcanDcfinitionMap中,以beanName 作为key,以BeanDefinition 对象作为value。之后,Spring容器根据 beanName找到对应的 BeanDefinition,再去选择具体的创建策略。

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

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

相关文章

华为HCIP认证H12-821题库上

1、2.OSPF核心知识 &#xff08;单选题&#xff09;下面关于0SPF的特殊区域&#xff0c;描述错误的是: A、Totally Stub Area允许ABR发布缺省的三类LSA,不接受五类LSA和细化三类LSA B、NSSA Area和Stub区域的不同在于该区域允许自治系统外部路由的引入&#xff0c;由ABR发布…

Linux完成mysql数据库的备份与恢复

背景&#xff1a; 在进行数据报表的测试过程中&#xff0c;为了让我们的测试数据更加真实&#xff0c;因此我们需要同步生产数据到测试环境。方式有很多种&#xff0c;我这里介绍的是通过Linux完成数据同步。 备份数据&#xff1a; 执行命令&#xff1a;mysqldump -uxxx -pxxx…

PyCharm连接远程服务器

要求&#xff1a;PyCharm专业版才支持远程服务 一、创建远程连接 先建立本地与远程服务器之间的SSH连接 1、配置连接 2、建立SSH连接&#xff0c;选择文件传输协议 SFTP 3、设置服务器名&#xff08;可以随意命名&#xff09; 4、配置 SSH连接 点击 172.18.1.202 配置…

字符串排序算法

题目描述&#xff1a; 题目描述 设计一个程序&#xff0c;实现对输入字符串数组按字符串长度进行排序功能。具体要求如下&#xff1a;编写函数void sortByLength(char *strArray[], int numStrings);&#xff0c;用于对输入的字符串数组 strArray 按字符串长度进行升序排序。在…

bugkuctf web随记wp

常规思路&#xff1a; 1&#xff0c;源码2&#xff0c;抓包3&#xff0c;御剑dirsearch扫后台检查是否有git文件未删除4&#xff0c;参数 本地管理员&#xff1a;1&#xff0c;cu看源码&#xff0c;sci看源码有一串东西2&#xff0c;base64解码后是test123猜测是密码3&#x…

数据处理架构

目录 Lambda架构 Kappa架构 Lambda架构 Lambda架构由Twitter的首席科学家Nathan Marz提出。这种架构试图平衡延迟、吞吐量、容错性和系统复杂性四个方面&#xff0c;以满足大数据和实时数据处理的需求。Lambda架构主要由三个层次组成&#xff1a; 批处理层&#xff08;Batch…

ChatGPT热门项目

1.智能GPT 项目地址&#xff1a;智能GPT&#xff1a;你只要提供OpenAI的API Key&#xff0c;那么它就可以根据你设定的目标&#xff0c;采用Google搜索、浏览网站、执行脚本等方式 主要语言&#xff1a;Python 推荐理由&#xff1a;这是由开发者Significant Gravitas推出的项目…

103基于matlab的极限学习机(ELM)和改进的YELM和集成极限学习机(EELM)是现在流行的超强学习机

基于matlab的极限学习机&#xff08;ELM&#xff09;和改进的YELM和集成极限学习机(EELM)是现在流行的超强学习机&#xff0c;该程序是三者的方法比对。 包括学习时间&#xff0c;训练精度和测试精度的对比。数据可更换自己 的&#xff0c;程序已调通&#xff0c;可直接运行…

从零开发短视频电商 OpenSearch/Elasticsearch 查询总结

文章目录 Match Queries&#xff08;全文查询&#xff09;Term Queries&#xff08;词项查询&#xff09;Range Queries&#xff08;范围查询&#xff09;Wildcard Queries&#xff08;通配符查询&#xff09;Fuzzy Queries&#xff08;模糊查询&#xff09;Prefix Queries&…

SpringBoot之数组,集合,日期参数的详细解析

1.4 数组集合参数 数组集合参数的使用场景&#xff1a;在HTML的表单中&#xff0c;有一个表单项是支持多选的(复选框)&#xff0c;可以提交选择的多个值。 多个值是怎么提交的呢&#xff1f;其实多个值也是一个一个的提交。 后端程序接收上述多个值的方式有两种&#xff1a; 数…

MacOS升级指定的系统

问题描述&#xff1a; Mac升级系统&#xff0c;如果使用默认推送的升级可能会升级到最新 的版本&#xff0c;那么怎样才能升级制定的系统呢&#xff1f;1. 搜索“macOS安装器” 2. 点击“使用App store 或浏览器下载macOS安装器” 3. 选择需要的系统&#xff0c;使用App Store …

飞天使-docker知识点5-资源限制与容器的不同状态

文章目录 cpu和内存的限制内存限制的部分参数容器的不同状态docker images 的分层docker registry制作镜像 cpu和内存的限制 默认情况下&#xff0c;容器没有资源限制&#xff0c;可以使用主机内核调度程序允许的尽可能多的 给定资源&#xff0c;Docker 提供了控制容器可以限制…

JavaWeb项目中已经导入依赖却报错依赖不存在

问题描述 在使用 Maven Servlet Tomcat 来搭建 JavaWeb 项目时&#xff0c;在 pom.xml 中正确引入了依赖&#xff0c;编码过程中也能够正常使用。但是在启动 Tomcat 之后&#xff08;启动时或启动后&#xff09;&#xff0c;却报错显示该依赖不存在。 可能原因 pom.xml 的…

品牌如何做好软文营销?媒介盒子分享

许多公司在做软文营销时&#xff0c;试图通过运营不同平台来扩大其覆盖范围&#xff0c;他们希望通过这种方式触达更多受众&#xff0c;然而如果品牌软文没有质感&#xff0c;就会被用户抛弃。今天媒介盒子就来和大家聊聊&#xff1a;品牌方做内容时如何加强质感。 一、 营销需…

12.14_黑马数据结构与算法笔记Java

目录 120 二叉搜索树 min max 121 二叉搜索树 put 122 二叉搜索树 前任后任1 123 二叉搜索树 前任后任2 124 二叉搜索树 删除1 125 二叉搜索树 删除2 126 二叉搜索树 删除3 127 二叉搜索树 删除 递归1 128 二叉搜索树 删除 递归2 129 二叉搜索树 范围查询 130 二叉搜…

Elasticsearch 查询语法

引言 Elasticsearch&#xff08;ES&#xff09;是一个高度可扩展的开源全文搜索和分析引擎。它允许你快速、实时地存储、搜索和分析大量数据。ES 强大的查询语言是其核心功能之一&#xff0c;它提供了多种查询类型来满足各种复杂的搜索需求。在这篇博客中&#xff0c;我们将深…

【超图】SuperMap iClient3D for WebGL/WebGPU —— 单体gltf模型与Blender中的方向对应关系

作者&#xff1a;taco 在很多包含动画的场景中&#xff0c;像模拟小人的行走、模拟火车的轨迹运行&#xff0c;又或者是模拟风力发电等等等。我们通常会加一些动画模型到里面。而有的时候可能会出现&#xff0c;这火车怎么倒着走啊&#xff01;这人怎么头朝下啊。这种方向的问题…

WPS Office JS宏实现Excel转换为JSON格式数据

通过Excel JS宏&#xff0c;将表格中的数据以”列“形式导出为JSON数据格式。 我们在整理文档时&#xff0c;产品会通过Excel将功能点和功能描述分层级整理出来&#xff0c;有时需要将此数据导入到系统中&#xff0c;Web端对Json这类数据比较友好&#xff0c;所以这里试着使用E…

说说React中setState和replaceState的区别?

在 React 中&#xff0c;setState()和 replaceState()是用于更新组件状态的两个方法。它们之间有一些区别。 1)setState(newState)&#xff1a;setState() 方法用于更新组件的状态。它接收一个新状态对象作为参数&#xff0c;并将新状态与当前状态合并。React 会合并状态更新并…

设计模式——代理模式(Proxy Pattern)

概述 代理模式是指为其他对象提供一种代理&#xff0c;以控制对这个对象的访问。代理对象在访问对象和目标对象之间起到中介作用。代理对象也可以在不修改目标对象的前提下&#xff0c;提供额外的功能操作&#xff0c;拓展目标对象的功能&#xff0c;比如说在目标对象的某个方法…