我有一个使用自写库的服务。在该库中,我使用了一些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
发出组件扫描,该扫描既是我的服务又是我的库的父程序包。
我的问题如下:
如果我包含该库的源代码,则可以正确拾取并初始化我的bean。之后,Spring BeanPostProcessor
正确地调用扩展类,从而正确地调用了我自己的方法。对此的调用如下所示:
private void doPostProcess(AnnotationType annotationType, Method method, Object bean) {
annotationType = postProcessAnnotation(annotationType, method);
... Other stuff in Spring lib
}
如果我包含自己库的.jar
文件,则库配置中的bean不会初始化,尽管Configuration本身也已初始化。
为什么会这样?我扫描具有或没有源的相同软件包,并且iself期望提供的唯一库与Spring无关。
答案 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。