spring-boot - spring-cloud 在解析属性 placeHolder 之前加载数据源 bean
问题描述
在我将 spring-cloud-context jar 导入我的 spring-boot2 项目后,它无法解析我的数据源 bean“org.apache.tomcat.jdbc.pool.DataSource”配置中的属性 placeHolder。但是其他bean配置中的相同属性placeHolder被成功解析。
像“com.alibaba.druid.pool.DruidDataSource”这样的其他数据源bean也有同样的问题。spring-cloud-context 中的哪个配置类导致 spring 加载数据源 bean 如此急切?
<bean id="dataSourceTarget" class="org.apache.tomcat.jdbc.pool.DataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="${mysql.url}" />
<property name="username" value="${mysql.username}" />
<property name="password" value="${mysql.password}" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="true" />
<property name="testOnReturn" value="false" />
<property name="validationInterval" value="60000" />
<property name="validationQuery" value="select 1 from dual" />
<property name="maxActive" value="100" />
<property name="minIdle" value="1" />
</bean>
<bean id="configTest1" class="wzp.rest.service.ConfigTest"
primary="true">
<property name="password" value="${mysql.password}" />
</bean>
pom.xml:
<!-- feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.4.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-archaius</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-archaius</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-ribbon</artifactId>
</exclusion>
<exclusion>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-hystrix</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
解决方案
我使用mybatis的MapperFactoryBean加载mapper,MapperFactoryBean加载sqlSessionFactory和datasource bean比PropertySourcesPlaceholderConfigurer更早改变占位符。
当我使用 org.mybatis.spring.mapper.MapperScannerConfigurer 加载映射器时,问题就消失了。
@ConditionalOnMissingBean 使所有工厂 bean 及其依赖 bean 及早初始化,并且在解析其定义中的占位符之前调用它们的 getObjectType 函数。然后spring-cloud-context jar中的spring cloud config客户端使正常的PropertySourcesPlaceholderConfigurer无法解析和更新这些bean的占位符。可以通过设置不使用云配置的人来禁止这种行为:
spring.cloud.config.enabled=false
spring.cloud.refresh.enabled=false
推荐阅读
- elasticsearch - 如何在每个固定天数后实现 ElasticSearch 新索引创建?
- fonts - wxPython获取系统字体轮廓数据
- azure-devops - Azure DevOps 服务帐户
- java - Spring Boot 应用程序加入不起作用
- database - Eloqua 中的联系人条目及其涉及的旅程?
- css - 如何在订单预览中更改订单状态操作按钮的颜色?
- flutter - 如何在数组颤动中查找重复元素的长度?
- java - 如何在 Spring Boot 项目中为 StoredProcedure 和 Column 创建自定义注释?
- c++ - C++ UndefinedBehaviorSanitizer:DEADLYSIGNAL
- reactjs - React useRouteMatch() - 无效的钩子调用