spring boot扫描并注入外部非spring bean

时间:2018-04-14 01:02:19

标签: java spring spring-boot

它需要什么,或者甚至可以对Spring进行扫描和注入非弹簧注释类?例如。

resource.jar

com.project.resource.ResourceInterface
com.project.resource.StandardResource <-- concrete implementation

@Singleton <--- Standard CDI annotation
public class StandardResource implements ResourceInterface{
    @Override
    public void something(){}
}

现在假设我有一个Spring启动应用程序,它取决于resource.jar

com.project.resource.SpringApp

@SpringBootApplication(scanBasePackages = {"com.project"})
@EnableAutoConfiguration
public class SpringApp{
    ... initializer
    @Inject
    private ResourceInterface resourceService; <--- this is not found
}

这应该是开箱即用吗?这甚至可能吗?我正在使用spring boot 2.0.0.RELEASE。我收到以下错误:

Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'MainController': Unsatisfied dependency expressed through field 'resourceService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.project.resource.ResourceInterface' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@javax.inject.Inject()}

由于

1 个答案:

答案 0 :(得分:1)

对于Spring框架@Singleton没有意义,因此即使通过组件扫描获取类,它也会被忽略。为了让Spring认出你的课程,你可以:

  • 在com.project.resource中创建一个配置类,其中包含@Bean ResourceInterface并将其实例化为StandardResource
  • 由于您使用的是Spring Boot,因此可以在resource.jar中创建自动配置(与第一个选项类似)。你可以按照例子 来自creating autoconfiguration。使用此方法,com.project.resource
  • 中无需进行任何更改

之后,您的春季启动应用程序将正常运行