为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕桂英4014372 2021-10-20 16:16:40
我有一个使用自编库的服务。在库中,我使用了一些 Spring 功能并扩展了一个 bean 后处理器以允许一些自定义配置。lib 本身包含 Spring 库作为 gradle 下的编译依赖项。这一切看起来如下:构建.gradlebuildscript {    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.8targetCompatibility = 1.8repositories {    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 无关。
查看完整描述

1 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

问题如下:


带有@Configuration要被覆盖的 bean 类型声明的注解的类AnnotationTypeAnnotationBeanPostProcessor没有导入声明 bean 的原始 Configuration 类。


出于某种原因,似乎 Spring 要求在按名称提供 bean 时显式设置它以覆盖 bean。我找不到原因。


明确地说,解决方案是更改包含覆盖 bean 的配置类声明:


@Configuration

public 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。


查看完整回答
反对 回复 2021-10-20
  • 1 回答
  • 0 关注
  • 190 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信