Springboot_全局配置、自动配置、条件注解

SpringBoot注解篇之@Resource与@Autowired 大家好,我是AK,最近在整理Java相关技术知识体系化;本篇主要介绍@Resource 注解和 @Autowired的区别以及使用,适合学习spring框架小伙伴了解学习。 阅读详情

1. 全局配置文件
 SpringBoot项目使用一个全局配置文件application.properties或者是application.yml来进行全局配置。
 配置位置:一般来讲,配置文件一般放在resource目录下或者类路径下的/config下。通常我们都是放在resource下。

我们来看下@SpringBootApplication注解的源码

spring:
    profiles:
        # 使用那个配置
        active: prod    

    datasource:
        name: dataSource 
        username: XXX
        password: XXX
        # 使用druid数据源 
        type: com.alibaba.druid.pool.DruidDataSource 
        driver-class-name: com.mysql.jdbc.Driver 
#        filters: stat
#        maxActive: 20
#        initialSize: 1
#        maxWait: 60000
#        minIdle: 1
#        timeBetweenEvictionRunsMillis: 60000
#        minEvictableIdleTimeMillis: 300000
#        validationQuery: select 'x'
#        testWhileIdle: true
#        testOnBorrow: false
#        testOnReturn: false
#        poolPreparedStatements: true
#        maxOpenPreparedStatements: 20
#        removeAbandoned: false 
logging:
   config: classpath:logbak.xml
#server:
#   ssl:
#     key-store: classpath:vc.dahancloud.com.jks
#     key-store-password: 4zc8zi119d2
---
# 开发环境配置
spring:
  profiles: dev
  datasource:
    url: jdbc:mysql://localhost:3306/iot?useUnicode=true&characterEncoding=UTF-8
server:
  port: 8080
---
# 测试环境配置
spring:
  profiles: prod
  datasource:
    url: jdbc:mysql://x.x.x.x:3306/iot?useUnicode=true&characterEncoding=UTF-8
server:
   port: 9097
alarmservice:
  alarm: http://localhost:8093

 说明:springboot的全局配置文件除了以上这些还有很多,可以参考一下API文档。

2. starter pom
 SpringBoot为我们提供了简化企业开发绝大多数场景的starter pom,只要使用了应用场景所需要的starter pom,相关的技术配置就会消除,就可以得到SpringBoot为我们提供的自动配置Bean。

 官方文档上提供的start pom有以下:

名称描述
spring-boot-startSpringBoot核心start,包含自动配置、日志、yml配置文件的支持
spring-boot-start-actuator准生产特性,用来监控和管理应用
spring-boot-start-remote-shell提供基于SSH协议的监控和管理
spring-boot-starter-amqp使用spring-rabbit来支持AMQP
spring-boot-start-aop使用spring-aop和AspectJ支持面向切面编程
spring-boot-starter-batch对Spring Batch支持
spring-boot-starter-cloud-connectors对云平台(Cloud Foundy、Heroku)提供的服务提供简化的连接方式
spring-boot-starter-data-elasticsearch通过spring-data-elasticsearch对Elasticsearch支持
spring-boot-starter-data-gemfire通过spring-data-gemfire对分布式存储GemFile的支持
spring-boot-starter-data-jpa对JPA的支持,包含spring-data-jpa、spring-orm和Hibernate
spring-boot-starter-jdbc对JDBC数据库的支持
spring-boot-starter-mail对javax.mail的支持
spring-boot-starter-redis对键值对内存数据库Redis的支持,包含spring-redis
spring-boot-starter-security对spring-security的支持
spring-boot-starter-social-facebook通过spring-social-facebook对Facebook的支持
spring-boot-starter-web对web项目开发的支持,包含Tomcat和spring-webmvc
spring-boot-starter-TomcatSpringBoot默认的Servlet容器Tomcat
spring-boot-starter-loggingSping Boot 默认的日志框架Logback
spring-boot-starter-log4j支持使用Log4J日志框架
spring-boot-starter-websocket对WebSocket开发的支持
spring-boot-starter-ws对Spring Web Services的支持

 
以上是列举一些starter pom ,还有一些并没有列举出来。如果需要可以自己去查阅文档。并且一些第三方技术都有自己推出的starter pom

 
3. 自动配置分析
 我们可以通过maven的命令dependency:sources来下载该maven项目中的所有依赖包的源码。

 我们在使用SpringBoot的时候会先生成一个SpringApplicaiton类,于是我们来分析一下这个类在生成中是如何进行自动配置的:/font>

//SpringApplicaiotn类的初始化方法
@SuppressWarnings({"unchecked","rawtypes"})
private void initialize (Object[] sources){
    if(sources!=null && sources.length>0){
        this.sources.addAll(Arrays.asList(source));
    }
    this.webEnvironment = deduceWebEnvironment();
    //注意这一步,这一步是进行自动配置
    setInitializers((Collection)getSpringFactoriesInstances(
            ApplictionContextInitializer.class));
    setListeners((Collection)getSpringFactoriesInstances(
            ApplicaitonListener.class));
    this.mainApplicationClass = deduMainApplicationClass();
}

 接着我们来看一下getSpringFactoriesInstance方法的源码

private <T> Collection<? extends T>getSpringFactoriesInstance(Class<T> type){
    return getSpringFactoriesInstance(type, new Class<?>[]{});
}

//我们来看下getSpringFactoriesInstance这个方法源码
private <T> Collection<? extends T> getSpringFactoriesInstances(Class<T> type,
            Class<?>[] paramterTypes, Object... args){
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    //使用names确保唯一性,防止重复
    Set<String> names = new LinkedHashSet<String>(
                //类加载器
                SpringFactoriesLoader.loadFactoryNames(type,classLoader));
    List<T> instances = createrSpringFactoriesInstances(type,parameterTypes,
                        classLoader,args,names);
    AnnotationAwareOrderComparator.sort(instances);
    return instances;

}

 我们来看下通过loadFactoryNames方法加载的情况

//配置的路径
public static final String FACTORIES_RESOURCE_LOCATION = 
                                    "META-INF/spring.factories";

public static List<String> loadFactoryNames(Class<?> factoryClass, 
                ClassLoader classLoder){
    String factoryName = factoryClass.getName();
    try{
        Enumeration<URL> urls =(ClassLoader!=null ? 
                    ClassLoader.getResource(FACTORIES_RESOURCE_LOCATION)) :
                    ClassLoader.getSystemResource(FACTORIES_RESOURCE_LOCATION);
        List<String> result = new ArrayList<String>();
        while(urls.hasMoreElements()){
            URL url = urls.nextElement();
            Properties properties = PropertiesLoaderUtils.loadProperties(
                                        new UrlResource(url));
            String factoryClassNames = properties.getProperty(factoryClassName);

            result.addAll(Array.asList(
               StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
        }
        return result;
    }catch(IOException ex){
        throw new IllegalArgumentException("Unable to load [" 
                + factoryClass.getName)+"] factories from location ["
                + FACTORIES_RESOURCE_LOCATION + "]",ex);
    }
}

 SpringBoo在进行SpringApplication对象实例化时会加载META-INF/spring.factories将其转变成对象,将该配置文件中的配置载入到Spring容器中。而这个配置文件里面配置了很多内容。

4. 条件注解
 我们在翻阅自动配置的过程中,可以回遇见很多条件注解,这边把常见的条件注解列举一下:

注解解释
@ConditionalOnClass({xxx.class})当存在xxx类的情况下,才会实例化该类
@ConditionalOnBean当容器里有指定的Bean的情况下
@ConditionalOnExpression基于SpEL表达式作为判断条件
@ConditionalOnJava基于JVM版本作为判断条件
@ConditionalOnJndi在JNDI存在的条件下查找指定的位置
@ConditionalOnMissingBean当容器里没有指定Bean的情况下
@ConditionalOnMissingClass当容器里没有指定类的条件下
@ConditionalOnNotWebApplication当前项目不是web项目的情况下
@ConditionalOnProperty指定属性是否有指定的值
@ConditionalOnResource类路径是否有指定的值
@ConditionalOnSingleCandidate指定Bean在容器中只有一个,
 或者虽然有多个但是指定首选的Bean
@ConditionalOnWebApplicaiton当前项目时Web项目的条件下
SpringBoot : 注解@Resource 1.美图 2.概述 在项目开发中,@Autowired和@Resource之争,一直搞不清楚,反正也不想搞清楚到底什么时候用@Autowired,什么场景下用@Resource,就一直用@Autowired得了。 ... 阅读详情

相关推荐

Springboot @Autowired 和 @Resource 我的剖析,你看完就不会忘

前言 @Autowired 和 @Resource 这两个注解大家想必都有在项目里面出现过,但是真的清楚这俩玩意的用法或者说是区别么? 一直用的都是@Autowired ? 别人代码用什么就copy用什么,反正他没错,俺也不会错? 它们都是一样的作用?只是名字不一样而已? 如果你存在以上这些疑问,那么你看这篇文章必赚! 上车! 如果你不存在以上这些疑问,那么你看这篇文章也不亏! 正文 跟着我 了解下 @Autowired 和@Resource ...

默默不代表沉默 1万+

SpringBoot常用注解速查

目录@Component、@Responsity、@Service、@Controller@Controller@Service@Responsity@Component@RestController与@Controller区别@Configuration和@Component区别加载过程@Bean@Resource、@Autowired@RequestMapping@RequestParam@Conditional@Transient @Component、@Responsity、@Service、@Co

m0_60725291的博客 1020

NVIDIA Video Codec SDK-解码接口cuvid简介

特性已废弃的 NVCUVID现代的 NVDECODE (底层 API)现代的 NVDECODE (高层 API - NvDecoder)状态已废弃 (Deprecated)官方推荐 (底层控制)官方推荐 (易用性首选)编程模型C 函数C 函数C++ 类复杂度高,需要管理大量细节中高,仍需管理解码会话低,开箱即用灵活性高高中(满足绝大多数场景)推荐对象遗留项目维护需要极致控制的高级用户所有新项目、大多数开发者。

fudexiang的博客 1176

SpringBoot中关于注解@Resource与@Autowired的区别

@Autowired只支持根据类型实现bean依赖注入,@Resource即支持根据类型注入,也支持根据bean名注入。

weixin_62578014的博客 1686

VASP能带计算避坑指南:从CHGCAR读取失败到成功解决的全过程

本文深度解析VASP能带计算中常见的“CHGCAR读取失败”报错,并提供从静态自洽到非自洽计算的全流程避坑指南。核心解决方案包括使用CONTCAR替代POSCAR、调整SYMPREC参数以处理对称性判定问题,并推荐利用vaspkit工具自动化生成输入文件,确保计算流程稳健高效。

weixin_29245767的博客 770

FPGA实战:手把手教你实现雷达信号数字下变频(DDC)完整流程

本文提供了一份完整的FPGA实现雷达信号数字下变频(DDC)的实战指南。内容涵盖从Matlab行为级仿真到FPGA硬件实现的完整闭环流程,详细讲解了数字混频、滤波、抽取等核心步骤,并分享了基于Vivado的IP核配置、数据位宽量化及资源优化等关键工程实践经验,旨在帮助读者掌握DDC系统的硬件实现与调试。

dog123的博客 341

@resource注解_Springboot_全局配置、自动配置、条件注解

1. 全局配置文件 SpringBoot项目使用一个全局配置文件application.properties或者是application.yml来进行全局配置。配置位置:一般来讲,配置文件一般放在resource目录下或者类路径下的/config下。通常我们都是放在resource下。我们来看下@SpringBootApplication注解的源码spring: profiles: ...

weixin_39898150的博客 1147

Vue3 - 手机移动端H5网页强力解决弹起软键盘后页面被挤压变形或页面整体上移问题,点击input输入框键盘弹出底部被上推往上顶遮挡及各种问题(兼容安卓苹果ios手机,微信公众号网页微信内置浏览器)

vue3,h5网页,input输入框组件,vue3 h5软键盘弹出,vue3输入框,键盘弹起时页面整体上移问题,uni,H5页面,解决软键盘弹起页面被挤压、被往顶的问题,解决vue3输入框,键盘弹起时页面整体上移问题,vue3调用手机系统软键盘,页面窗口被顶起,布局定位失效,解决VUE3软键盘弹起导致页面fixed定位元素被顶上去,输入法软键盘弹起,窗口顶起,变形解决办法,Vue中input组件在IOS设备上弹出软键盘时页面整体上移问题的解决方案,以及input组件聚焦后弹出软键盘固定在,Vue3软键盘把界

🏆 前端领域优质创作者 1万+

springboot 配置全局响应数据_Springboot_全局配置、自动配置、条件注解

1. 全局配置文件 SpringBoot项目使用一个全局配置文件application.properties或者是application.yml来进行全局配置。配置位置:一般来讲,配置文件一般放在resource目录下或者类路径下的/config下。通常我们都是放在resource下。我们来看下@SpringBootApplication注解的源码spring: profiles: ...

weixin_39786617的博客 206

深度学习(五)迁移学习(实战:新数据预测+vgg16和聚类预测)

6、成功引入PCA数据降维技术,剔除了数据中的噪音信息、降低了模型复杂度、减少了模型训练时间,并最终提高了模型表现;gen=datagen.flow_from_directory(path,target_size=(224,224),batch_size=2,save_to_dir=dst_path,save_prefix='gen',save_format='jpg') # 生成图片大小224*224,bs产生多少组图像,存储路径和前缀。1、通过使用新数据,实现了模型的2次训练,达到了较好的预测效果;

weixin_37699342的博客 775

突破边缘AI算力瓶颈:YOLOv12模型剪枝与知识蒸馏联合优化全攻略

这套剪枝-蒸馏联合方案的优势在于其系统性和可靠性。它不是单一的技巧,而是一套完整的工程流程,确保了从研发到部署的无缝衔接。

m0_71589036的博客 219

springboot 配置全局响应数据_Java架构之Springboot_全局配置、自动配置、条件注解...

1. 全局配置文件  SpringBoot项目使用一个全局配置文件application.properties或者是application.yml来进行全局配置。 配置位置:一般来讲,配置文件一般放在resource目录下或者类路径下的/config下。通常我们都是放在resource下。我们来看下@SpringBootApplication注解的源码spring: profiles: # 使用那...

weixin_42401281的博客 226

基于SAHI算法优化YOLOv8的小目标检测性能研究

SAHI(SliceAwareHyperInference)是一种推理优化算法,通过将大图切片为小块并分别推理的方式,实现更精细的小目标检测。提升小目标检测精度:切片后的小目标在每个小块中占比更大,模型能够更好地聚焦。兼容性强:可直接集成到现有目标检测框架中(如YOLO系列、Detectron2等)。支持大分辨率图片和视频推理:减少硬件对大图推理的限制。本文详细探讨了如何通过SAHI(切片辅助超推理算法)结合YOLOv8模型,有效提升小目标检测性能,尤其是在高分辨率图片和视频场景中表现优异。

博客 2371

面试官:说一下Spring Boot的自动配置原理?

那么所有其他的和这个类相关的属性都可以在全局配置文件中定义,也就是说,真正“限制”我们可以在全局配置文件中配置哪些属性的类就是这些XxxxProperties类,它与配置文件中定义的prefix关键字开头的一组属性是唯一对应的。除了官方文档为我们提供了大量的属性解释,我们也可以使用IDE的相关提示功能,比如IDEA的自动提示,和Eclipse的YEdit插件,都可以很好的对你需要配置的属性进行提示,下图是使用Eclipse的YEdit插件的效果,Eclipse的版本是:STS 4。

m0_69632475的博客 1094

基于Simulink的双PMSM差速驱动转矩同步控制建模示例

本文详细介绍了基于Simulink的双永磁同步电机(PMSM)差速驱动转矩同步控制建模方法。针对AGV/叉车等双电机独立驱动系统的转矩不同步问题,提出主从式+交叉耦合控制策略,在Simulink中实现直线行驶、90°转弯和单轮打滑恢复三种工况的仿真验证。通过动力学建模、参数差异设置、同步误差定义及控制律设计,最终实现同步误差<3%、转弯半径跟踪误差<5%、打滑后100ms内恢复的性能指标。文章特别强调了实际工程中的参数标定、通信同步和故障处理要点,并提供了完整的Simulink建模步骤和工具箱使

xiaoheshang_123的博客 204

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

SpringBoot面试杀手锏——自动配置原理

Java面试笔试面经、Java技术每天学习一点公众号Java面试关注我不迷路作者:圣斗士Morty来源:https://blog.youkuaiyun.com/u014745069/引言不论在工作中,...

java面试笔试 208

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Springboot自动配置原理解析

Springboot自动配置原理 工作原理 新建一个spirngboot项目,在启动类上可以看到一个@SpringBootApplication注解。 这是spirngboot自动配置的关键所在,点进去发现它里面包含了3个重要的注解。 @SpringBootConfiguration: 本质上就是一个@Configuration,二者功能也一致,标注当前类是配置类 ( 使用Configuration配置类等同于XML文件 ) @EnableAutoConfinguration:开启自动配置(主要看这个)

weixin_44559993的博客 297

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SpringBoot自动配置原理

引言 不论在工作中,亦或是求职面试,Spring Boot已经成为我们必知必会的技能项。除了某些老旧的政府项目或金融项目持有观望态度外,如今的各行各业都在飞速的拥抱这个已经不是很新的Spring启动框架。 当然,作为Spring Boot的精髓,自动配置原理的工作过程往往只有在“面试”的时候才能用得上,但是如果在工作中你能够深入的理解Spring Boot的自动配置原理,将无往不利。 Spring Boot的出现,得益于“习惯优于配置”的理念,没有繁琐的配置、难以集成的内容(大多数流行第三方技术都被集

Pastxu的小屋 272

SpringBoot常见面试题汇总(超详细回答)

Spring Boot 高频面试题汇总,附详细答案。

qq_33129875的博客 2万+

Spring Boot 自动配置原理

Spring Boot的出现,得益于“习惯优于配置”的理念,没有繁琐的配置、难以集成的内容(大多数流行第三方技术都被集成),这是基于Spring 4.x提供的按条件配置Bean的能力。 自动配置原理作为Spring Boot的精髓,深入的理解Spring Boot的自动配置原理,在工作中将无往不利。 一、Spring Boot的配置文件 初识Spring Boot时我们就知道,Spring ...

GSON的博客 514

阿里面试:问springBoot自动装配我这样回答的,面试官对我竖起了大拇指

上周一个读者面试刚刚遇到的,新鲜出炉的面试题。

root 2444

【详解】面试必问:SpringBoot自动配置原理

前言 SpringBoot框架是开发中的一大利器,其简化了spring的xml的配置,遵循了”约定大于配置“的原则,使用注解对常用的配置做默认配置,减少使用xml配置模式。SpringBoot为常用框架封装了大量的starter,比如spring-boot-starter-web会整合springmvc和内嵌的tomcat。SpringBoot在底层封装了默认的配置,修改配置在application.yml全局配置文件。如今在pom.xml文件中引用starter就可以使用这个框架,使用...

CodingLJ 1万+

阿里面试:说说springboot自动装配是怎么回事?

在这个类上有一个注解:@ConfigurationProperties,它的作用就是从配置文件中绑定属性到对应的bean上(也就是把我们application.properties对应的server.port映射到ServerProperties 类中的port属性)而@EnableConfigurationProperties这个注解就是把已经绑定了属性的bean(ServerProperties)注入到spring容器中(相当于@Component注解一样)。其他的都是因为不满足条件注解而被过滤了。

2403_88996764的博客 604
上一篇: Springboot___@SpringBootApplicaiton分析
下一篇: Java源码___String类(九)
pseudonym_
博客等级 码龄10年 88粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值