在Spring项目中将库类注入为依赖项

时间:2018-09-25 06:48:08

标签: java spring dependency-injection

我的项目中有多个库类,需要将它们注入服务类中。这是 IntegrationFactory 类的错误声明:

  

考虑在您的配置中定义类型为“ com.ignitionone.service.programmanager.integration.IntegrationFactory”的bean。

几乎每个注入该库类的注入都会出现此错误。

我已经在 @ComponentScan 中添加了Library包,但是由于它是只读文件,因此无法注释该库类。我从这里的一些答案中知道,Spring无法注入它无法管理的类。该库不是在spring上构建的。

我试图创建一个@Bean方法,该方法在使用@Inject的类中返回IntegrationFactory(有问题的类),但这似乎也不起作用。

如何做到这一点,最好不要创建存根/复制类?

这是EngagementServiceImpl类片段:

@Inject


public EngagementServiceImpl(EngagementRepository engagementRepository,
                               @Lazy IntegrationFactory integrationFactory, TokenRepository tokenRepository,
                               EngagementPartnerRepository engagementPartnerRepository, MetricsService metricsService) {
    this.engagementRepository = engagementRepository;
    this.integrationFactory = integrationFactory;
    this.tokenRepository = tokenRepository;
    this.engagementPartnerRepository = engagementPartnerRepository;
    this.metricsService = metricsService;
  }

这是注射部分:

@Autowired
    private EngagementService engagementService;

这是ConfigClass:

@Configuration
public class ConfigClass {

    @Bean
    public IntegrationFactory getIntegrationFactory(){
        Map<String, Object> globalConfig = new HashMap<>();
        return new IntegrationFactory(globalConfig);
    }

    @Bean
    @Primary
    public EntityDataStore getEntityDataStore(){

        EntityModel entityModel = Models.ENTITY;

        return new EntityDataStore(this.dataSource(), entityModel );
    }


    @ConfigurationProperties(prefix = "datasource.postgres")
    @Bean
    @Primary
    public DataSource dataSource() {
        return DataSourceBuilder
                .create()
                .build();
    }

}

2 个答案:

答案 0 :(得分:1)

您需要在配置类中添加bean定义。

@Configuration
public class ServiceConfig {

    @Bean
    public IntegrationFactory getIntegrationFactory(){
        // return an IntegrationFactory instance
    }

}

然后,您必须确保Spring将@Configuration类检测到,方法是将其放在扫描路径中,或者通过@Import手动从扫描路径中的某个位置将其导入。考虑您正在使用Spring Boot的@Import示例。

@Import(ServiceConfig.class)
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

希望这会有所帮助!

答案 1 :(得分:1)

找不到您的Bean IntegrationFactory,因为它没有使用任何Spring构造型进行注释,因此无法被组件扫描识别。

由于您有多种选择可以向应用程序上下文提供类的实例,请阅读Spring文档(其中还包括示例)以找出最适合您的一个: https://docs.spring.io/spring/docs/5.1.0.RELEASE/spring-framework-reference/core.html#beans-java-basic-concepts

一个选择是创建一个工厂,该工厂将类的实例提供给应用程序上下文,如文档中所述:

@Configuration
public class AppConfig {

    @Bean
    public IntegrationFactory myIntegrationFactory() {
        return new IntegrationFactory();
    }
}

不要忘记将配置添加到应用程序上下文中。