使用 jar 文件而不是源文件时未初始化 Bean

我有一个使用自编库的服务。在库中,我使用了一些 Spring 功能并扩展了一个 bean 后处理器以允许一些自定义配置。lib 本身包含 Spring 库作为 gradle 下的编译依赖项。这一切看起来如下:


构建.gradle


buildscript {

    ext {

        springBootVersion = '2.0.3.RELEASE'

    }

    repositories {

        mavenCentral()

    }

    dependencies {

        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")

    }

}


apply plugin: 'java'

apply plugin: 'org.springframework.boot'

apply plugin: 'io.spring.dependency-management'


group = 'org.stuff.library'

sourceCompatibility = 1.8

targetCompatibility = 1.8


repositories {

    mavenCentral()

    maven { url "https://repo.spring.io/snapshot" }

    maven { url "https://repo.spring.io/milestone" }

}



ext {

    springCloudVersion = 'Finchley.RELEASE'

    jacksonVersion = '2.9.6'

    lombokVersion = '1.16.18'

    jooqVersion = '3.11.2'

    flywayVersion = '5.1.3'

}


dependencies {


    compile 'org.aspectj:aspectjweaver'

    compile 'org.springframework:spring-tx'

    compile 'org.springframework.cloud:spring-cloud-stream'

    compile 'org.springframework.cloud:spring-cloud-stream-binder-kafka'

    compile 'org.apache.commons:commons-lang3:3.5'

    compile 'org.javassist:javassist:3.22.0-GA'

    compile "org.flywaydb:flyway-core:${flywayVersion}"


    compileOnly "org.jooq:jooq:${jooqVersion}"

    compileOnly "org.projectlombok:lombok:${lombokVersion}"


    // other testCompile dependencies

}

Bean 扩展后处理器:


package org.stuff.library.config;


public class AnnotationTypePostProcessor extends AnnotationTypeBeanPostProcessor {


  @Override

  public AnnotationType postProcessAnnotation(AnnotationType original Annotation, Method annotatedMethod) {


  ... do some service-specific stuff

  return super.postProcessAnnotation();

  }

}


启动时,我发出一个组件扫描,通过org.stuff它是我的服务和我的库的父包。


如果我包含.jar自己库的文件,则库配置中的 bean未初始化,尽管配置本身已初始化。


为什么会发生这种情况?我使用或不使用源扫描相同的包,并且它本身期望带来的唯一库与 Spring 无关。


慕桂英4014372
浏览 193回答 1
1回答

BIG阳

问题如下:带有@Configuration要被覆盖的 bean 类型声明的注解的类AnnotationTypeAnnotationBeanPostProcessor没有导入声明 bean 的原始 Configuration 类。出于某种原因,似乎 Spring 要求在按名称提供 bean 时显式设置它以覆盖 bean。我找不到原因。明确地说,解决方案是更改包含覆盖 bean 的配置类声明:@Configurationpublic class SomeConfig() {@Bean(name = {SPRING_LIB_BEAN_NAME})public static AnnotationTypeAnnotationBeanPostProcessor annotationTypeAnnotationBeanPostProcessor() {    return new AnnotationTypePostProcessor();}到:@Configuration@Import(OriginalConfigurationClassContainingBeanBelow.class)public class SomeConfig() {@Bean(name = {SPRING_LIB_BEAN_NAME})public static AnnotationTypeAnnotationBeanPostProcessor annotationTypeAnnotationBeanPostProcessor() {    return new AnnotationTypePostProcessor();}在那之后,Spring 总是使用被覆盖的 bean。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java