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

自定义bean 加载到spring IOC容器中

自定义bean加载到spring容器中的两种方式:

  • 1.在类上添加注解@Controller@RestController(本质是@Controller)、@Service@Repository@Component
  • 2.使用@Configuration@Bean
    这篇文章主要介绍第二种方式原理(因为在实际使用中,第二种方式遇到了一个问题,记录一下)。

抛出问题

在微服务中定义一个文件上传模块,目的是为了以后在其他任何需要的微服务中直接引用。由于配置是在配置文件中,需要使用@Value("${xxx}")获取配置(VolcengineUtils.java中获取),故需要被spring注解扫描到,并初始化上传对象,但是始终没有初始化这个配置文件!!!

@Configuration
public class VolcengineConfig {@Value("${meta.volcengine.endPoint}")private String endPoint;@Value("${meta.volcengine.region}")private String region;@Value("${meta.volcengine.accessKey}")private String accessKey;@Value("${meta.volcengine.secretKey}")private String secretKey;@Value("${meta.volcengine.bucketName}")private String bucketName;@Beanpublic void initVolcengineInfo(){VolcengineUtils.setClient(new TOSV2ClientBuilder().build(region, endPoint, accessKey, secretKey));VolcengineUtils.setBucketName(bucketName);}
}

思考1:直接把配置文件放到项目中没有问题,移出作为一个模块怎么就会有问题?

对比后发现:服务项目和上传组件的包(package)的名称不一样
服务项目:
在这里插入图片描述
上传组件:
在这里插入图片描述
然后修改上传组件的包名为:com.meta.modules.file.volcengine
再次启动:没问题了!

思考2.为什么修改包名相同就可以了?那如果对外提供组件,总不能要求别人的服务项目和组件同包名吧?

于是继续寻找解决方案:然后找到在resources资源目录下META-INF\spring.factories中增加扫描路径可以被spring加载,于是增加META-INF\spring.factories文件(上传组件包名已还原为:com.meta.core.file.volcengine)

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.meta.core.file.volcengine.VolcengineConfig

再次启动:没问题了!

回答思考1不同包名不能被扫描问题:

1.服务启动项:点击注解@SpringBootApplication进入

在这里插入图片描述

2.点击注解@ComponentScan进入

在这里插入图片描述
注释翻译:如果指定的包没有被定义,则扫描将从声明该注释的类的包中进行。也就是如果没有配置@ComponentScan注解中basePackageClassesbasePackagesvalue的值,则从@SpringBootApplication注解类所在的包开始扫描

思考3.spring.factories配置是如何加载的?

1.服务启动项:点击注解@SpringBootApplication进入–>点击注解@EnableAutoConfiguration进入

在这里插入图片描述
发现有一个自动配置导入选择器,点击进入AutoConfigurationImportSelector.class类中
在这里插入图片描述
通过断点即可发现:在spring.factories中指定的配置已经被加载到spring容器中。
优化VolcengineConfig类: 使用spring.factories加载配置显然更通用,其次此处只需要初始化一次配置,不需要把initVolcengineInfo声明为bean。使用@PostConstruct在bean加载完成后初始化一次即可

public class VolcengineConfig {@Value("${meta.volcengine.endPoint}")private String endPoint;@Value("${meta.volcengine.region}")private String region;@Value("${meta.volcengine.accessKey}")private String accessKey;@Value("${meta.volcengine.secretKey}")private String secretKey;@Value("${meta.volcengine.bucketName}")private String bucketName;@PostConstructpublic void initVolcengineInfo(){VolcengineUtils.setClient(new TOSV2ClientBuilder().build(region, endPoint, accessKey, secretKey));VolcengineUtils.setBucketName(bucketName);}
}
http://www.lryc.cn/news/6661.html

相关文章:

  • [python入门㊻] - python装饰器和类的装饰器
  • 企业级信息系统开发学习1.1 初识Spring——采用Spring配置文件管理Bean
  • CSS盒子模型
  • Python基础学习笔记 —— 数据结构与算法
  • 笔记本连接wifi,浏览器访问页面,显示访问被拒绝
  • 36个物联网专业毕业论文选题推荐
  • Pytorch复习笔记--torch.nn.functional.interpolate()和cv2.resize()的使用与比较
  • ASP.NET Core MVC 项目 AOP之ActionFilterAttribute
  • 浅析EasyCVR安防视频能力在智慧小区建设场景中的应用及意义
  • Python的深、浅拷贝到底是怎么回事?一篇解决问题
  • TCP协议十大特性
  • 2.14作业【GPIIO控制LED】
  • 5min搞定linux环境Jenkins的安装
  • Cortex-M0存储器系统
  • 软件测试——测试用例之场景法
  • 英文写作中的常用的衔接词
  • 新库上线 | CnOpenData中国地方政府债券信息数据
  • Python 条件语句
  • C语言思维导图大总结 可用于期末考试 C语言期末考试题库
  • 从零实现深度学习框架——再探多层双向RNN的实现
  • Flink 连接流详解
  • 分享112个HTML电子商务模板,总有一款适合您
  • 2023备战金三银四,Python自动化软件测试面试宝典合集(八)
  • J-Link RTT Viewer使用教程(附代码)
  • C语言——指针、数组的经典笔试题目
  • 【C语言】程序环境和预处理|预处理详解|定义宏(上)
  • 上海霄腾自动化装备盛装亮相2023生物发酵展
  • python+flask开发mock服务
  • 数据库(三)
  • 2023软考纸质证书领取通知来了!