Spring框架中的Bean的各种加载方式

news2024/9/24 13:23:09

在这里插入图片描述
大家好,这里向大家主要介绍Spring框架以及SpringBoot框架中的Bean的各种加载方式,有时候我们的学习,就是单纯为了工作效率而作为工具使用,于是乎,往往忽略了其最重要的一点,那就是底层原理!所以有时候遇到一些问题就会很棘手,往往因为底层不够扎实!这里我们一起学习,这是我自己的一个学习笔记,与大家共勉,一起进步!

Bean的各种加载方式

在Java中,"Bean"通常指的是由Spring框架管理的对象实例。Spring提供了多种方式来加载Bean,以满足不同的需求和场景。以下是各种Bean加载方式的详细介绍:

  1. 基于XML配置的加载:
    这是Spring早期版本中最常见的加载方式。通过在XML配置文件中定义Bean的声明和依赖关系,Spring可以在应用程序启动时读取并实例化这些Bean。XML配置文件通常使用<bean>标签来声明Bean,并使用属性或构造函数参数来设置Bean的属性值和依赖关系。

    示例:

    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
             http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="userService" class="com.example.UserService">
            <property name="userRepository" ref="userRepository"/>
        </bean>
    
        <bean id="userRepository" class="com.example.UserRepository"/>
    </beans>
    
  2. 基于Java配置的加载:
    Spring提供了基于Java的配置方式,通过Java类代替XML文件来定义Bean。这种方式使用@Configuration注解标记一个类,并在该类中使用@Bean注解声明Bean的实例化和依赖关系。

    示例:

    @Configuration
    public class AppConfig {
    
        @Bean
        public UserService userService() {
            return new UserService(userRepository());
        }
    
        @Bean
        public UserRepository userRepository() {
            return new UserRepository();
        }
    }
    
  3. 基于注解的加载:
    使用注解来标记Bean类和依赖关系,这种方式称为基于注解的Bean加载。Spring提供了各种注解,如@Component@Service@Repository等,用于标记不同类型的Bean。同时,可以使用@Autowired注解自动注入依赖关系。

    示例:

    @Service
    public class UserService {
    
        private UserRepository userRepository;
    
        @Autowired
        public UserService(UserRepository userRepository) {
            this.userRepository = userRepository;
        }
    }
    
  4. 基于扫描的加载:
    在基于注解的加载方式中,还可以使用@ComponentScan注解来指定要扫描的包,Spring会自动扫描这些包并识别带有特定注解的类,将它们作为Bean注册到应用程序上下文中。

    示例:

    @Configuration
    @ComponentScan("com.example")
    public class AppConfig {
        // Bean declarations are not required here if using component scanning
    }
    
  5. 基于XML和注解的混合加载:
    在一些场景下,可能会同时使用XML配置和注解来加载Bean。这种混合方式允许在XML文件中声明一些Bean,同时使用注解来标记其他Bean和依赖关系。

    示例:

    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
             http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="userService" class="com.example.UserService"/>
    </beans>
    
    @Service
    public class UserRepository {
        // ...
    }
    

这些是Spring中常见的Bean加载方式。根据具体需求和项目结构,可以选择适合的加载方式。

概念区分

我们会隐约感觉到,似乎@Configuration@Component是同一个东西呀,似乎没有什么区别,这里我们稍微做一个区分,加深理解,同时也解开心中疑惑!

@Configuration@Component是Spring框架中两个重要的注解,它们之间有一些区别,主要体现在它们的作用和用途上:

  1. @Configuration:
    @Configuration注解用于标记Java类,表明这个类是一个配置类,其中定义了一个或多个Spring Bean的定义。配置类中通常使用@Bean注解声明Bean的实例化和依赖关系。@Configuration类可以看作是对XML配置文件的替代,通过Java代码来配置应用程序的组件。

    关键点:

    • @Configuration用于定义配置类,Spring容器会解析这个类,并将其中声明的Bean注册到容器中。
    • @Bean注解用于在配置类中声明Bean的实例化,方法名即为Bean的名称,返回值即为Bean的实例。
    • 配置类中可以包含其他Java配置元素,如条件化配置,Bean的初始化等。

    示例:

    @Configuration
    public class AppConfig {
    
        @Bean
        public UserService userService() {
            return new UserService(userRepository());
        }
    
        @Bean
        public UserRepository userRepository() {
            return new UserRepository();
        }
    }
    
  2. @Component:
    @Component注解是Spring中最通用的注解之一,用于标记一个类为Spring Bean。Spring容器会自动扫描指定包及其子包下的所有类,识别标记了@Component以及其派生注解(如@Service@Repository@Controller等)的类,并将其实例化为Bean。

    关键点:

    • @Component用于标记普通的Spring Bean类,这些类可能是服务、存储库、控制器或其他组件。
    • @Component可以被用于自动装配(依赖注入)等场景,而无需在配置类中显式声明Bean的定义。

    示例:

    @Component
    public class UserRepository {
        // ...
    }
    
  3. 区别:

    • 主要作用:@Configuration用于定义配置类和Bean的声明,而@Component用于标记普通的Bean类。
    • 使用场景:@Configuration通常用于创建Spring的配置类,用Java代码取代XML配置;而@Component用于标记普通的Bean,让它们被Spring容器管理。
    • 扫描方式:@Configuration不会被自动扫描,必须显式引入到配置中;而@Component及其派生注解会被Spring容器自动扫描并注册为Bean。
    • 层级关系:@Configuration是一种特殊的@Component,所以它们之间是继承关系,但在使用时要注意不要将配置类误用为普通Bean。

综上所述,@Configuration主要用于定义配置类,用Java代码配置Spring的Bean和组件,而@Component用于标记普通的Bean类,让它们被Spring容器管理。在实际开发中,两者经常会结合使用,通过配置类来声明一些特殊的Bean和配置,然后再通过自动扫描来注册其他普通的Bean。就是使用上稍作区分,大家在概念上可以理解为一致!

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

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

相关文章

分享一次使用iostat命令定位邮件系统性能故障的经历

目录 一、背景介绍 二、环境介绍 三、分析过程 四、解决方法 最近在整理iostat&#xff0c;回忆起以前处理的系统性能的问题&#xff0c;现把分析方法整理如下。 一、背景介绍 以前公司内网部署有一套邮件系统&#xff0c;每天下午16:00-16:30之间邮件收发非常卡。 二、环…

C++类与对象 - 4(初始化列表,Static成员,友元,内部类,匿名对象)

类与对象 - 4 1. 再谈构造函数1.1 构造函数体赋值1.2 初始化列表&#xff08;重点&#xff09;1.3 explicit关键字 2. Static成员2.1 概念2.2 特性 3. 友元3.1 友元函数3.2 友元类 4. 内部类5.匿名对象 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通过…

python包的介绍使用

python包的介绍使用 简单来说python的模块相当于文件&#xff0c;包就相当于文件夹 python包创建后会自动生成 init.py 的文件 然后可以在不同的包下面创建不同的模块 下面是引入模块里面的内容的三种方式 第一种就是引入模块&#xff0c;记住引入包是会报错的 import只能引…

ansible-playbook roles模块编写lnmp剧本

目录 一&#xff1a;集中式编写lnmp剧本 二&#xff1a;分布式安装lnmp 1、nginx 配置 2、mysql配置 3、php配置 4、运行剧本 一&#xff1a;集中式编写lnmp剧本 vim /etc/ansible/lnmp.yml- name: lnmp playhosts: dbserversremote_user: roottasks:- name: perpare condif…

JSON对象

目录 简介 创建对象 ​编辑json对象作为属性值 json用于交换数据 简介 json&#xff1a;javascript object notation(js标记对象)是一种轻量化的数据交换模式&#xff0c;特点&#xff1a;体积小&#xff0c;数据量大 在js中&#xff0c;json是以对象的形式存在的&#x…

uniapp自定义消息语音

需求是后端推送的消息APP要响自定义语音&#xff0c;利用官方插件&#xff0c;总结下整体流程 uniapp后台配置 因为2.0只支持uniapp自己的后台发送消息&#xff0c;所以要自己的后台发送消息只能用1.0 插件地址和代码 插件地址: link let isIos (plus.os.name "iOS&qu…

30_万维网-The World Wide Web

前2篇我们深入讨论了电线、信号、交换机、数据包路由器以及协议&#xff0c;它们共同组成了互联网。 今天我们向上再抽象一层&#xff0c;来讨论万维网。 文章目录 1. 互联网(Internet)与万维网(World Wide Web)关系2. 万维网(World Wide Web)2.1 超链接"(hyperlinks)2.2…

【前端知识】React 基础巩固(四十三)——Effect Hook

React 基础巩固(四十三)——Effect Hook 一、Effect Hook的基本使用 Effect Hook 用来完成一些类似class中生命周期的功能。 在使用类组件时&#xff0c;不管是渲染、网路请求还是操作DOM&#xff0c;其逻辑和代码是杂糅在一起的。例如我们希望把计数器结果显示在标签上&…

CRM系统如何进行公海池线索分配自动化?

在销售过程中&#xff0c;线索分配是一个非常重要的环节。传统的线索分配方式往往是由销售主管手动进行&#xff0c;不仅效率低下&#xff0c;还存在着不公平、不灵活的问题。因此&#xff0c;许多企业通过CRM来实现公海池线索分配自动化。 1、基于规则的分配 CRM可以让用户设…

docker push 报错:unauthorized: unauthorized to access repository: library/xx处理方法

rootmaster:/home/data/harbor# sudo docker login 49.0.241.2 admin Harbor12345 1.报错原因分析 rootmaster:/home/data/harbor# docker push 49.0.241.2/library/nginx:latest #这种报错 The push refers to repository [49.0.241.2/library/nginx] Get "https://49.…

windows自动化点击大麦app抢购、捡漏,仅支持windows11操作系统

文章目录 必要条件程序运行必要条件 确保windows11版本操作系统,如果不是可以通过镜像升级为windows11如果已经是windows11操作系统,确保更新到最新版本 修改系统所在时区,将国家或地区改为美国 开启虚拟化 勾选Hyper-V,如果没有则不需要勾选 勾选虚拟机平台 勾选完毕,点…

pytest固件fixture不同层级作用域如何调用

之前的一篇文章中讲解了fixture结合conftest.py文件如何简单实现自动化。实际fixture结合conftest.py文件的使用就是一种fixture的会话层级session的实战用法。 下面开始fixture其他层级的详细讲解&#xff1a; 1、首先在使用fixture之前我们得先了解他是干什么的&#xff0c…

python_PyQt5开发验证K线视觉想法工具V1.1 _增加标记类型_线段

目录 运行情况&#xff1a; 代码&#xff1a; 承接 【python_PyQt5开发验证K线视觉想法工具V1.0】 博文 https://blog.csdn.net/m0_37967652/article/details/131966298 运行情况&#xff1a; 添加线段数据在K线图中用线段绘制出来 代码&#xff1a; 1 线段标记的数据格式…

M1中安装PD18.3.2

1.下载 在添加链接描述中直接搜索Paralles Desktop 点击右下角的免费下载(Z10 MB) 点击安装说明中的第一个选项直接下载链接 安装说明中第一条强调了必须关闭SIP 点击右上角的下载文件 下载后 2.双击解压文件 3.点击解压后的映像文件 4.点击安装&#xff0c;再次点击打开…

【嵌入式学习笔记】嵌入式基础7——认识HAL库

1.初识HAL库 1.1.CMSIS CMSIS (微控制器软件接口标准)&#xff1a;Cortex Microcontroller Software Interface Standard&#xff0c;是由ARM和与其合作的芯片厂商、软件工具厂商&#xff0c;共同制定的标准。 1.2.HAL库简介 直接操作寄存器&#xff1a;执行效率高&#x…

JVM基础篇-本地方法栈与堆

JVM基础篇-本地方法栈与堆 本地方法栈 什么是本地方法? 本地方法即那些不是由java层面实现的方法&#xff0c;而是由c/c实现交给java层面进行调用&#xff0c;这些方法在java中使用native关键字标识 public native int hashCode()本地方法栈的作用? 为本地方法提供内存空…

Vue中默认插槽,具名插槽,作用域插槽区别详解

默认插槽&#xff1a; App.vue : 在app.vue中使用MyCategory&#xff0c;里面包裹的结构是不显示的&#xff0c;要想在页面中显示&#xff0c;就需要用到插槽。在子组件MyCategory中定义 <template><div class"container"><MyCategory title"美…

号称永不限速的它抛弃初心,网盘界从此再无净土

自从百度网盘一家独大&#xff0c;带来免费用户 KB/s 级下载体验后&#xff0c;小忆一直在期待一款免费不限速网盘。 直到阿里云盘的出现可算是满足了小忆对网盘的所有期许。 新用户初始免费容量尽管只有 100G&#xff0c;但当初通过几个简单小任务就能轻松提升至数 TB。 最重…

渗透测试:Linux提权精讲(二)之sudo方法第二期

目录 写在开头 sudo expect sudo fail2ban sudo find sudo flock sudo ftp sudo gcc sudo gdb sudo git sudo gzip/gunzip sudo iftop sudo hping3 sudo java 总结与思考 写在开头 本文在上一篇博客的基础上继续讲解渗透测试的sudo提权方法。相关内容的介绍与背…