Spring Boot原理分析(二):项目启动(下)——自动装配

news2024/11/14 16:35:13

文章目录

  • 一、Spring手动装配
    • 1.使用XML配置文件
    • 2.使用Java注解
    • 3.使用Java类
  • 二、Spring Boot自动装配
    • 1.@AutoConfigurationPackage
    • 2.@Import(AutoConfigurationImportSelector.class)

一、Spring手动装配

Spring Framework提供了多种手动装配的方式,其中比较常见的有以下几种:

1.使用XML配置文件

在XML配置文件中使用<bean>元素配置需要装配的Bean对象,然后使用ClassPathXmlApplicationContext或者XmlWebApplicationContext启动Spring容器。Spring容器会自动解析XML配置文件,并将其中配置的Bean对象注册为Spring容器中的Bean对象。

示例代码如下:

<beans>
    <bean id="myService" class="com.example.service.MyServiceImpl"/>
    <bean id="myController" class="com.example.controller.MyController">
        <property name="myService" ref="myService"/>
    </bean>
</beans>

2.使用Java注解

在Java类中使用@Configuration注解标记一个配置类,然后在该类中使用@Bean注解标记需要装配的Bean对象。然后使用AnnotationConfigApplicationContext启动Spring容器。Spring容器会自动扫描@Configuration注解的类,并将其中使用@Bean注解标记的方法的返回值注册为Spring容器中的Bean对象。

示例代码如下:

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }

    @Bean
    public MyController myController() {
        MyController controller = new MyController();
        controller.setMyService(myService());
        return controller;
    }
}

3.使用Java类

直接在Java类中创建需要装配的Bean对象,并将其注册到Spring容器中。然后使用AnnotationConfigApplicationContext启动Spring容器。Spring容器会自动扫描Java类中注册的Bean对象,并将其注册为Spring容器中的Bean对象。

示例代码如下:

public class MyConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }

    @Bean
    public MyController myController() {
        MyController controller = new MyController();
        controller.setMyService(myService());
        return controller;
    }
}

public class MyApp {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
        MyController controller = context.getBean(MyController.class);
        // ...
    }
}

需要注意的是,Spring Framework的手动装配方式适用于需要对Bean进行复杂的配置或者需要根据特定条件进行Bean的选择和装配的场景。对于简单的Bean对象,使用自动装配方式更加方便快捷。

二、Spring Boot自动装配

SpringBoot的自动配置完全由 @EnableAutoConfiguration 开启,这一注解是上一篇博客中所介绍的@SpringBootApplication注解中的组成之一。

在这里插入图片描述

从@EnableAutoConfiguration的定义可以看出,@AutoConfigurationPackage注解是它的组成之一。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

	/**
	 * Environment property that can be used to override when auto-configuration is
	 * enabled.
	 */
	String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

	/**
	 * Exclude specific auto-configuration classes such that they will never be applied.
	 * @return the classes to exclude
	 */
	Class<?>[] exclude() default {};

	/**
	 * Exclude specific auto-configuration class names such that they will never be
	 * applied.
	 * @return the class names to exclude
	 * @since 1.3.0
	 */
	String[] excludeName() default {};

}

1.@AutoConfigurationPackage

@AutoConfigurationPackage注解的作用是将当前类所在的包及其子包中的所有类都注册到Spring Boot的自动配置中。这样,Spring Boot就可以扫描到这些类,并根据它们的特性和需求进行自动配置。

2.@Import(AutoConfigurationImportSelector.class)

@Import(AutoConfigurationImportSelector.class)注解的作用是让Spring Boot自动扫描classpath下的META-INF/spring.factories文件,从中获取所有的自动配置类,并将这些自动配置类导入到Spring Boot应用程序中。

spring.factories是一个标准的Java properties文件,它可以在classpath下的任何SpringFramework的jar包中找到。在这个文件中,可以通过键值对的方式指定自动配置类的全限定类名,例如:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration

这个键值对指定了两个自动配置类:DataSourceAutoConfiguration和HibernateJpaAutoConfiguration。在Spring Boot启动应用程序时,Spring Boot会自动扫描到这些自动配置类,并根据它们的特性和需求进行自动配置。

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

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

相关文章

硬盘被程序使用

diskutil list diskutil umount /dev/disk2s1退出该进程 硬盘即可成功退出

springboot+redis+mysql+quartz-通过Java操作jedis使用pipeline获取缓存数据定时更新数据库

一、重点 代码讲解&#xff1a;6-点赞功能-定时持久化到数据库-pipelinelua-优化pipeline_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1yP411C7dr 代码&#xff1a; blogLike_schedule/like06 xin麒/XinQiUtilsOrDemo - 码云 - 开源中国 (gitee.com) https://g…

ubuntu下,verdi语法错误Syntax error: “(“ unexpected

【问题】/home/EDA_TOOLS/synopsys/verdi/verdi/Verdi_O-2018.09-SP2/bin/verdi: 56: /home/EDA_TOOLS/synopsys/verdi/verdi/Verdi_O-2018.09-SP2/bin/verdi: Syntax error: "(" unexpected 【解析】 代码对于标准bash而言没有错&#xff0c;因为Ubuntu/Debian为了加…

网络应用基础交换机的基础操作(NETBASE第六课)

网络应用基础交换机的基础操作&#xff08;NETBASE第六课&#xff09; 1 回顾代码实操 主题背景的转换 字体设置 背景的设置 第一点 在操作ENSP个人建议要关闭防火墙 第二点 在操作ENSP软件是观察下面的软件是否全部关闭了 第三点 打开软件 ENSP软件注册信息 操作如下 注册前…

Oracle之Scott用户

Oracle增删改查&#xff0c;事务与序列 前言 1、解锁scott用户 2、雇员表&#xff08;emp&#xff09; 3、部门表&#xff08;dept&#xff09; 4、工资等级表&#xff08;salgrade&#xff09;了解 5、奖金表&#xff08;bonus&#xff09;了解 1、解锁scott用户 --解锁scot…

对卷积和全连接之间关系的学习(1*1卷积与全连接层可以互换吗?)

1.对于卷积和全连接 首先我们看一张图&#xff0c;它是一张关于卷积的操作&#xff1a; 然后在看关于全连接的操作&#xff1a; 从上面两张图中可以看出卷积的过程和全连接的过程&#xff0c;我们利用粉色的卷积核在image上进行卷积&#xff0c;进行内积计算得到输出值3&#…

调用GPU进行深度学习模型训练问题检查总结

1、电脑是否具有nvidia的GPU显卡。 2、安装的cuda版本是否超过显卡支持的最高版本。 在nvidia设置->帮助->系统信息->组件&#xff0c;可查看。 3、安装的pytorch是否为gpu版&#xff0c;即使在官网中复制的gpu版安装命令&#xff0c;安装得到的也有可能为cpu版。 建…

【监控系统】监控系统简介以及主流监控框架对比

互联网应用中离不开监控系统&#xff0c;那么为什么会有监控系统呢&#xff1f; 互联网公司产品通常是通过软件、网站、App或其他数字化方式提供服务的&#xff0c;这类产品在使用过程中可能会面临一系列风险和挑战。 比如网络故障或稳定性问题&#xff0c;由于网络故障、硬件…

外设资源共享须知

外设资源共享 具有相同ID的只能使用一个&#xff0c;无法同时使用。 例如当使能了SPIM0&#xff0c; 就不能用TWIM0&#xff0c;因为基地址相同&#xff0c;不能同时使用。此时建议使用TWIM1. 在sdk_config.h 中配置时需留意。

tecplot360 只显示指定phase的设定体积分数的区域

tecplot360 只显示指定phase的设定体积分数的区域 到数入据抽取切面设定显示体积分数范围 参考1&#xff1a; Tecplot中如何提取水线面&#xff08;自由表面&#xff09;并绘图 参考2&#xff1a; 两相流计算中&#xff0c;如何用Tecplot提取水相断面平均物理量&#xff1f; …

创建一个django项目详细说明

1.首先安装django pip install django 2.创建django项目 django-admin startproject myproject 输入命令后自动生成相关文件 manage.py文件&#xff1a;这是管理Django项目的重要命令行工具&#xff0c;它主要用于启动项目、创建应用和完成数据库的迁移等。settings.py文件&…

mongodb集群工作原理学习

mongodb集群 MongoDB集群有好几种方式:,主从模式,副本集模式和分片的模式 其中主从模式基本不再使用,大多是后面两种 副本集模式 副本集模式主要是用于实现服务的高可用性,类型Redis的哨兵模式. 它主要是的特点: 创建集群后会有主节点(primary)和从节点(secondary). 但从节点…

1765_Perl实现fileread功能

全部学习汇总&#xff1a; GreyZhang/perl_basic: some perl basic learning notes. (github.com) fileread是MATLAB中的一个函数&#xff0c;可以实现对一个文本文件的全文读取。读取后的内容返回给一个字符串量。在Python中也有类似的功能&#xff0c;不过MATLAB中的这个更能…

快速创建ES集群

win10 中docker 设置 快速创建集群 访问 官网 elasticsearch/docs/reference/setup/install/docker at main elastic/elasticsearch GitHub 负责上面2个文件&#xff0c;并修改&#xff0c;修改如下 .env文件 # Password for the elastic user (at least 6 characters) …

【私有云】网络虚拟化

前言 大家好&#xff0c;我是秋意零。 之前一直对 OpenStack 网络很陌生与神奇啊&#xff0c;不知道它是如何实现的&#xff0c;网络结构是怎样的。不过&#xff0c;今天介绍的是网络虚拟化&#xff0c;它在 OpenStack 中及云计算中是非常重要的概念&#xff0c;是理解 OpenS…

springboot整合websocket遇到的小问题

今天尝试了通过springboot整合websocket来初步学习使用websocket&#xff0c;然后发现启动的时候报错了&#xff0c;发这篇文章分享一下。 springboot整合websocket的步骤很简单&#xff1a; 第一步&#xff1a;创建一个springboot项目&#xff0c;在这里命名为websocket 在I…

day16 移除元素

题目描述 解题思路&#xff1a; 1.快慢指针&#xff0c;移除数组元素只能是下标操作&#xff1b;fast往前&#xff0c;不等于value的时候&#xff0c;赋给slow&#xff1b; 2.slow&#xff1b;返回的长度直接返回slow&#xff1b; int removeElement(int* nums, int numsSize, …

Rethinking the Role of Pre-ranking in Large-scale E-Commerce Searching system

来源&#xff1a; KDD’2023Taobao Search 文章目录 ASHASMOL训练样本训练目标蒸馏精排 总结 反思粗排在大规模电商搜索系统中的角色。 由于巨大的数据量以及对系统实时反馈的要求&#xff0c;一个典型的工业排序系统通常由这些模块组成&#xff1a;召回&#xff08;matching&…

VTR编译问题

机器环境 vmware 16.0&#xff1b; ubuntu22.04.02; 问题描述 一、在build过程中会出现一些警告&#xff0c;但没有停止&#xff1b; 二、访问 **raw.githubsercontent.com/…/…**相关网站被拒绝&#xff0c;如下图&#xff1a; 之前在 /etc/hosts 仅仅是添加了raw.github…

JS数组解构赋值变量存在依赖关系

题目随便起的&#xff0c; 在刷力扣 41.缺失的第一个正数 这个题的时候&#xff0c;出现了解构赋值的问题&#xff0c; 对于[a,b] [1,2]和[b,a][2,1]按理说都是行的通的&#xff0c;和位置没有关系&#xff0c;本质上都是进行交换 可是当我在题目中 使用[nums[nums[i]-1], nu…