当前位置: 首页 > news >正文

springboot加载注入bean的方式

在SpringBoot的大环境下,基本上很少使用之前的xml配置Bean,主要是因为这种方式不好维护而且也不够方便。
springboto注入bean主要采用下图几种方式,分为本地服务工程注解声明的bean和外部依赖包中的bean。
在这里插入图片描述

一、 springboot装配本地服务工程中的bean

1、注解装配Bean

1、使用Component,Service,Controller,Repository等派生注解
只要在类上加类上加 @Component 注解即可,该注解只要被扫描到就会注入到spring的bean容器中。

@Component
public class AnoDemoBean {
}

当然不只是@Component注解可以声明Bean,还有如:@Repository、@Service、@Controller 等常用注解同样可以。

如果去看这些注解,就发现这些注解上本身就有加 @Component 注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component   //可以看到@Service注解上有添加@Component,  @Repository和@Controller也一样。        
public @interface Service {@AliasFor(annotation = Component.class)String value() default "";
}

这系列注解的出现,给我们带来了极大的便利。我们不需要像以前那样在bean.xml文件中配置bean了,现在只用在类上加上相关注解,就能轻松完成bean的定义。

这四种注解在功能上其实没有特别的区别,不过在业界有个不成文的约定:

  • Controller 一般用在控制层
  • Service 一般用在业务层
  • Repository 一般用在数据层
  • Component 一般用在公共组件上

2、@Bean定义方式

这种方式,主要是结合Configuration来定义bean,首先是声明一个配置类,而后再配置类中,经过返回bean对象的方法形式来声明bean,通常使用姿式以下

@Data
public class ConfigDemoBean {
}@Configuration
public class BeanLoadConfig {@Beanpublic ConfigDemoBean configDemoBean() {return new ConfigDemoBean();}
}

须要说明的一点是BeanLoadConfig类自己也被Spring容器看为一个Bean。

3、Component注解 VS Bean注解

1)作用对象不同:@Component 注解作用于类,而 @Bean 注解作用于方法。

@Bean 方式更加灵活,比如当我们引用第三方库中的类需要装配到 Spring 容器时,只能通过 @Bean 来实现。

比如

@Configuration
public class WireThirdLibClass {@Beanpublic ThirdLibClass getThirdLibClass() {//第三方的ThirdLibClass类return new ThirdLibClass();}
}

再比如

@Bean
public OneService getService(status) {case (status)  {when 1:return new serviceImpl1();when 2:return new serviceImpl2();when 3:return new serviceImpl3();}
}

这两点都是@Component无法做到,只能@Bean实现,所以说@Bean更加灵活。

2)@Component通常是通过类路径扫描来自动装配到Spring容器中。而@Bean通常我们会在该注解的方法中定义产生这个bean的逻辑。

我们可以加一些@Conditional,@ConditionalOnBean等等一些注解来控制是否声明该Bean,不会一开始就自动装配到Spring容器中。

比如

public class MacCondition implements Condition {@Overridepublic boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {Environment environment = conditionContext.getEnvironment();String property = environment.getProperty("os.name");if (property.contains("Mac")) {log.info("当前操作系统是:Mac OS X");return true;}return false;}
}@Configuration
public class ConditionalConfig {/*** 如果MacCondition的实现方法返回true,则注入这个bean*/@Bean("mac")@Conditional({MacCondition.class})public SystemBean systemMac() {log.info("ConditionalConfig方法注入 mac实体");return new SystemBean("Mac ios系统","001");}
}

上面的例子表示,如果当前操作系统是Mac,才会注入当前Bean。这个也只能 @Bean 注解才能实现。

总结:@Component和@Bean都是用来注册Bean并装配到Spring容器中,但是Bean比Component的自定义性更强。可以实现一些Component实现不了的自定义加载类。

二、springboot装配依赖包中的bean

当SpingBoot主类启动的时候,@SpringBootApplication注解会默认去扫描的自己所在包路径和它的子包路径下的所有需要装配的类,自动装配到spring的bean容器中。
但是如果你提供了一个Jar包供第三方用户使用,那么你这个jar包中的Bean,能被第三方加载么?
这就要看你当前项目的包名和你引用的第三方Jar包的包名是否一致了?如果一致,第三方依赖包中的bean可以直接加载,如果不一致,则无法加载第三方依赖中的bean。
例如,如果你当前项目本包的地址是com.jincou,而你引用的第三方Jar的本包也是 com.jincou,那么第三方Jar的Bean就可以被扫描到并注入到spring的容器中。如果你当前项目本包的地址是com.jincou ,而你引用的第三方Jar的本包是 com.third,那么也就是第三方Jar的Bean无法被扫描到,所以也就无法注入到Spring容器中。

比如这里有个第三方的Bean。要如何做才能被扫描注入到Spring容器中呢。

package com.third.bean;import org.springframework.stereotype.Component;/*** @Description: 这个bean作为第三方bean 给依赖该jar包的项目使用*/
@Component
public class ThirdComponentBean {private String type = "第三方ThirdComponent注解生成bean实体";
}

1、ComponentScan注解

很简单,既然@SpringBootApplication注解默认扫描只是当前项目的本包和它的子包,那就想办法让它扫描第三方jar的包就好了。

/*** @Description: Springboot 启动类*/
@ComponentScan(basePackages ={"com.third.bean"})
@SpringBootApplication()
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class);}
}

@ComponentScan主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中。

需要装配的类也就是上面加了@Controller,@Service,@Repository,@Component,@Configuration等等的注解的Bean到IOC容器中。

这里不一定要加在启动类上,你可以加在加在装配的类上,但建议加在启动类上,比较直观,后期如果要改动或者去除也比较好找。

2、Import注解

@ComponentScan是扫描整个包,但其实你可能只需注入一个或者几个指定的Bean,那我们可以考虑用 @Import 注解

@Import(value= com.third.bean.ThirdComponentBean.class)
@SpringBootApplication()
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class);}
}

这样做同样也会成功的将ThirdComponentBean对象注入到Spring的bean容器中。

3、spring.factories文件中配置bean

上面两种注入方式都有个很明显缺点,就是如果我需要引用外部jar包的Bean的时候,都需要在当前项目配置 @ComponentScan 或者 @Import 去扫描才能注入当前Bean,这样显然不够友好。

可不可以当前项目什么都不做就可以直接引用第三方jar的Bean呢?

当然可以。

我们只需要在将配置放在第三方jar指定的文件中即可,使用者会自动加载,从而避免的代码的侵入

在资源目录下新建目录 META-INF
在 META-INF 目录下新建文件 spring.factories
在文件中添加下面配置

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.third.bean.ConfigurationBean

相关文章:

springboot加载注入bean的方式

在SpringBoot的大环境下,基本上很少使用之前的xml配置Bean,主要是因为这种方式不好维护而且也不够方便。 springboto注入bean主要采用下图几种方式,分为本地服务工程注解声明的bean和外部依赖包中的bean。 一、 springboot装配本地服务工程…...

PostgreSQL 数据库设计与管理(四)

1. 数据库设计原则 1.1 规范化 规范化是组织数据库结构的一种方法,旨在减少数据冗余并提高数据完整性。常用的规范化范式包括: 第一范式(1NF): 确保每列都是原子的,不可再分。第二范式(2NF&a…...

Studying-代码随想录训练营day21| 669.修建二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、二叉树总结

第21天,二叉树最后一篇,冲💪 目录 669.修建二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 二叉树总结 669.修建二叉搜索树 文档讲解:代码随想录修建二叉搜索树 视频讲解:手撕修建二叉…...

GraphQL:简介

GraphQL 图片来源: 我们将探索GraphQL 的基础知识,并学习如何使用Apollo将其与 React 和 React Native 等前端框架连接起来。这将帮助您了解如何使用 GraphQL、React、React Native 和 Apollo 构建现代、高效的应用程序。 什么是 GraphQL?…...

AI大模型安全挑战和安全要求解读

引言 随着人工智能技术的飞速发展,大模型技术以其卓越的性能和广泛的应用前景,正在重塑人工智能领域的新格局。然而,任何技术都有两面性,大模型在带来前所未有便利的同时,也引发了深刻的安全和伦理挑战。 大模型&…...

前端面试题-token的存放位置

哈喽小伙伴们大家好,本系列是一个专门针对前端开发岗的面试题系列,每周将会不定期分享一些面试题,希望对大家有所帮助. 面试官:token 一般在客户端存在哪儿 求职者:Token一般在客户端存在以下几个地方: (1)Cookie:Token可以存储在客户端的Cookie中。服…...

深入探讨计算机网络中的各种报文

在计算机网络中,报文(Packet)是数据传输的基本单位。不同的协议使用不同类型的报文来实现数据传输的各种功能。本文将详细探讨计算机网络中常见的几种报文类型,并通过举例说明其具体应用。 一、TCP/IP协议栈中的报文 TCP/IP协议…...

Debezium系列之:Mysql和SQLServer数据库字段类型覆盖测试

Debezium系列之:Mysql和SQLServer数据库字段类型覆盖测试 一、需求背景二、类型对比三、完整流程三、Mysql数据库全字段类型覆盖测试四、SQLServer数据库字段类型覆盖测试一、需求背景 Debezium版本升级迭代,要做字段类型测试,确保版本间字段类型的差异下游能够自动适应,或…...

Mathtype7在Word2016中闪退(安装过6)

安装教程:https://blog.csdn.net/Little_pudding10/article/details/135465291 Mathtype7在Word2016中闪退是因为安装过Mathtype6,MathPage.wll和MathType Comm***.dotm),不会随着Mathtype的删除自动删除,而新版的Mathtype中的文件…...

SQL面试题练习 —— 合并用户浏览行为

目录 1 题目2 建表语句3 题解 1 题目 有一份用户访问记录表,记录用户id和访问时间,如果用户访问时间间隔小于60s则认为时一次浏览,请合并用户的浏览行为。 样例数据 ------------------------ | user_id | access_time | ---------------…...

【Docker】docker 替换宿主与容器的映射端口和文件路径

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 docker 替换宿主与容器的映射端口和文件夹 1. 正文 1.1 关闭docker 服务 systemctl stop docker1.2 找到容器的配置文件 cd /var/lib/docker/contain…...

GPU算力租用平台推荐

推荐以下几家GPU算力租用平台: 1. AWS (Amazon Web Services) EC2 - AWS提供多种GPU实例,适合不同的计算需求,如机器学习、深度学习和图形渲染等。 - 优点:全球覆盖面广,稳定性高,服务支持全面。 …...

定个小目标之刷LeetCode热题(31)

238. 除自身以外数组的乘积 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请 不要使用除法&#…...

我在高职教STM32——LCD液晶显示(3)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正因如此,才有了借助 CSDN 平台寻求认同感和成就…...

uniapp横屏移动端卡片缩进轮播图

uniapp横屏移动端卡片缩进轮播图 效果&#xff1a; 代码&#xff1a; <!-- 简单封装轮播图组件:swiperCard --> <template><swiper class"swiper" circular :indicator-dots"true" :autoplay"true" :interval"10000&quo…...

整合Spring Boot和Apache Solr进行全文搜索

整合Spring Boot和Apache Solr进行全文搜索 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在现代应用开发中&#xff0c;全文搜索是许多应用不可或缺的功能之…...

网络治理新模式:Web3时代的社会价值重构

随着Web3技术的崛起&#xff0c;传统的网络治理模式正在经历革新&#xff0c;这不仅仅是技术的进步&#xff0c;更是对社会价值观念的挑战和重构。本文将深入探讨Web3时代的网络治理新模式&#xff0c;其背后的技术基础、社会影响以及未来的发展方向。 1. 引言 Web3时代&#…...

[个人感悟] MySQL应该考察哪些问题?

前言 数据存储一直是软件开发中必不可少的一环, 从早期的文件存储txt, Excel, Doc, Access, 以及关系数据库时代的MySQL,SQL Server, Oracle, DB2, 乃至最近的大数据时代f非关系型数据库:Hadoop, HBase, MongoDB. 此外还有顺序型数据库InfluxDB, 图数据库Neo4J, 分布式数据库T…...

《数据结构与算法基础》学习笔记——1.2基本概念和术语

一、本章结构 二、四个数据相关专业名词的解释 两者的区别 三、数据结构相关内容 四、逻辑结构的分类 五、存储结构的分类及四种基本存储结构...

Java之线程相关应用实现

后台线程 一个进程中只有后台进程运行&#xff0c;该进程将会结束。 新创建的线程默认为前台线程&#xff0c;Java中只要有一个前台线程运行&#xff0c;就不会结束程序&#xff0c;如果只有后台线程运行&#xff0c;程序就会结束&#xff0c;可以在线程对象启动前执行setDae…...

VTOL无人机微多普勒特征分析与6G感知技术

1. VTOL无人机微多普勒特征分析的技术背景垂直起降&#xff08;VTOL&#xff09;无人机因其独特的飞行能力在军事和民用领域获得广泛应用&#xff0c;但同时也带来了空域管理的新挑战。传统雷达识别方法主要依赖目标的宏观运动特征&#xff0c;难以精确区分VTOL的不同飞行阶段。…...

Windows平台PDF处理终极解决方案:Poppler预编译包深度解析

Windows平台PDF处理终极解决方案&#xff1a;Poppler预编译包深度解析 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 在Windows环境下处理PDF文件…...

PHP批量导出数据,CSV格式文件 - 支持几十万行数据无压力

目录 一、前言 二、解决方案 三、示例 一、前言 之前做数据批量导出一直都是用的PHPExcel插件&#xff0c;一个是由于现在PHPExcel已经不再维护了&#xff0c;一个是如果导出大批量数据&#xff0c;导出的表格就会提示数据损坏、文件不完整之类的提示&#xff0c;就是打不开…...

AI应用开发平台RiserFlow实战:从架构解析到智能客服构建

1. 项目概述&#xff1a;从“RiserFlow”看现代AI应用开发范式的演进最近在GitHub上看到一个挺有意思的项目&#xff0c;叫riserlabs/riserflow。光看这个名字&#xff0c;可能有点摸不着头脑&#xff0c;但如果你点进去&#xff0c;会发现它其实指向一个更具体的产品&#xff…...

从零基础到AI大模型高手,自学AI大模型学习路线推荐,不走弯路!

本文提供了一条详尽的AI大模型自学路线&#xff0c;旨在帮助新手小白系统学习。路线涵盖数学与编程基础、机器学习入门、深度学习深入、大模型探索、进阶与应用以及社区与资源等多个方面。内容详细列出了各阶段的学习资源&#xff0c;包括经典书籍、在线课程、实践项目等&#…...

5个简单步骤实现iOS虚拟定位:iFakeLocation终极解决方案

5个简单步骤实现iOS虚拟定位&#xff1a;iFakeLocation终极解决方案 【免费下载链接】iFakeLocation Simulate locations on iOS devices on Windows, Mac and Ubuntu. 项目地址: https://gitcode.com/gh_mirrors/if/iFakeLocation 你是否曾经需要在不同城市测试应用的位…...

Midjourney咖啡印相为何总偏灰?揭秘RGB→Lab→咖啡染料光谱响应的3层色彩断层及校正算法

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney咖啡印相为何总偏灰&#xff1f;揭秘RGB→Lab→咖啡染料光谱响应的3层色彩断层及校正算法 咖啡印相&#xff08;Coffee Cyanotype&#xff09;作为一种新兴的生物友好型物理输出工艺&#xf…...

2026年邵阳高复机构大揭秘,哪家才是学子的理想之选?

高考失利后&#xff0c;复读成为许多学子重新追逐梦想的途径。在邵阳&#xff0c;众多高复机构如繁星般闪耀&#xff0c;而湘郡铭志学校高复部无疑是其中一颗璀璨的明星。接下来&#xff0c;让我们深入了解湘郡铭志学校高复部&#xff0c;同时对比其他知名高复机构&#xff0c;…...

BBDown终极指南:5分钟掌握B站视频本地化完整解决方案

BBDown终极指南&#xff1a;5分钟掌握B站视频本地化完整解决方案 【免费下载链接】BBDown Bilibili Downloader. 一个命令行式哔哩哔哩下载器. 项目地址: https://gitcode.com/gh_mirrors/bb/BBDown 在数字内容爆炸的时代&#xff0c;你是否曾为无法离线观看B站优质视频…...

Claude AI代码扩展工具:在IDE中无缝集成智能编程助手

1. 项目概述&#xff1a;一个为Claude AI设计的代码扩展工具最近在折腾AI编程助手的时候&#xff0c;发现了一个挺有意思的项目——dliedke/ClaudeCodeExtension。这玩意儿说白了&#xff0c;就是一个专门为Claude&#xff08;就是Anthropic家那个AI&#xff09;设计的代码扩展…...