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

时间:2018-10-01 10:15:43

标签: java spring

我有一个使用自写库的服务。在该库中,我使用了一些Spring功能,并扩展了bean后处理器以允许进行一些自定义配置。该库本身包括Spring库,作为gradle下的编译依赖项。一切如下所示:

build.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();
  }
}

此bean的实例如下:

@Bean(
    name = {SPRING_LIB_BEAN_NAME}
)
public static AnnotationTypeAnnotationBeanPostProcessor annotationTypeAnnotationBeanPostProcessor() {
    return new AnnotationTypePostProcessor();
}

启动时,我通过org.stuff发出组件扫描,该扫描既是我的服务又是我的库的父程序包。

我的问题如下:

  1. 如果我包含该库的源代码,则可以正确拾取并初始化我的bean。之后,Spring BeanPostProcessor正确地调用扩展类,从而正确地调用了我自己的方法。对此的调用如下所示:

    private void doPostProcess(AnnotationType annotationType, Method method, Object bean) {
    annotationType = postProcessAnnotation(annotationType, method);
    ... Other stuff in Spring lib
    }
    
  2. 如果我包含自己库的.jar文件,则库配置中的bean不会初始化,尽管Configuration本身也已初始化。

    < / li>

为什么会这样?我扫描具有或没有源的相同软件包,并且iself期望提供的唯一库与Spring无关。

1 个答案:

答案 0 :(得分:0)

与此相关的问题如下:

@Configuration注释的类具有AnnotationTypeAnnotationBeanPostProcessor类型的将要覆盖的bean声明的类没有导入声明该bean的原始Configuration类。

出于某种原因,似乎Spring要求对此进行显式设置,以便在按名称命名时覆盖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。