西湖区外贸网站建设,小目标网站建设,做学校网站素材图片,wordpress推荐主机自定义bean加载到spring容器中的两种方式#xff1a;
1.在类上添加注解Controller、RestController#xff08;本质是Controller#xff09;、Service、Repository、Component2.使用Configuration和Bean 这篇文章主要介绍第二种方式原理#xff08;因为在实际使用中#…自定义bean加载到spring容器中的两种方式
1.在类上添加注解Controller、RestController本质是Controller、Service、Repository、Component2.使用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注解中basePackageClasses、basePackages、value的值则从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);}
}