【问题标题】:spring-cloud load datasource bean earlier than parse property placeHolderspring-cloud 在解析属性 placeHolder 之前加载数据源 bean
【发布时间】:2018-06-26 02:45:06
【问题描述】:

在我将 spring-cloud-context jar 导入我的 spring-boot2 项目后,它无法解析我的数据源 bean“org.apache.tomcat.jdbc.pool.DataSource”配置中的属性 placeHolder。但是其他 bean config 中相同的属性 placeHolder 解析成功。

像“com.alibaba.druid.pool.DruidDataSource”这样的其他数据源bean也有同样的问题。 spring-cloud-context 中的哪个配置类导致 spring load 数据源 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>

【问题讨论】:

    标签: spring-boot spring-cloud


    【解决方案1】:

    我使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 2022-08-20
      • 2020-05-03
      • 1970-01-01
      • 2014-05-01
      相关资源
      最近更新 更多