当前位置: 首页 > 知识库问答 >
问题:

Spring Boot-自动配置包含自动连接依赖项的类

富勇军
2023-03-14

我正在开发一个具有可重用逻辑的公共java库,以与一些AWS服务交互,这些服务将依次被多个消费者应用程序使用。出于这里概述的原因,以及Spring Boot似乎为SQS集成之类的东西提供了大量无模板代码的事实,我决定将此公共库实现为具有自动配置的定制Spring Boot启动器。

我也是Spring框架的新手,因此遇到了一个问题,即我的自动配置类的实例变量没有通过AutoWired注释进行初始化。

为了更好地解释这一点,这里是我的公共依赖关系的一个非常简化的版本。

CommonCore。Java语言

@Component
public class CommonCore { 

   @AutoWired
   ReadProperties readProperties;

   @AutoWired
   SqsListener sqsListener; // this will be based on spring-cloud-starter-aws-messaging 

   public CommonCore() {
       Properties props = readProperties.loadCoreProperties();
       //initialize stuff
   }

   processEvents(){
     // starts processing events from a kinesis stream.
   }
}

ReadProperties.java

@Component
public class ReadProperties {

    @Value("${some.property.from.application.properties}")
    private String someProperty;

    public Properties loadCoreProperties() {
      Properties properties = new Properties();
      properties.setProperty("some.property", someProperty);
      
      return properties;
    }
 }

CoreAutoConfiguration.java

@Configuration
public class CommonCoreAutoConfiguration {

    @Bean
    public CommonCore getCommonCore() {  
        return new CommonCore();
    }
}

通用依赖关系将由其他应用程序使用,例如:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })
public class SampleConsumerApp implements ApplicationRunner {

    @Autowired
    CommonCore commonCore;

    public SampleConsumerApp() {
    }

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

    @Override
    public void run(ApplicationArguments args) {

        try {
            commonCore.processEvents();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

我提到的主要问题是,CommonCore实例中的自动连线对象没有按预期进行初始化。然而,我认为实际问题更加根深蒂固;但由于我对Spring框架缺乏理解,我发现自己很难调试它。

我希望能从这些方面得到一些启示

  1. 这种开发定制初学者的方法对我的用例有意义吗

共有1个答案

韦鸣
2023-03-14

胡猜,但我认为这是因为事物构造的顺序。我说的是这门课:

@Component
public class CommonCore { 

   @AutoWired
   ReadProperties readProperties;

   @AutoWired
   SqsListener sqsListener; // this will be based on spring-cloud-starter-aws-messaging 

   public CommonCore() {
       Properties props = readProperties.loadCoreProperties();
       //initialize stuff
   }

   processEvents(){
     // starts processing events from a kinesis stream.
   }
}

您试图在构造函数中使用Spring注入的组件,但构造函数在Spring可以执行其@Autowire魔法之前被调用。

因此,一种选择是自动关联为构造函数参数

类似这样(未经测试):

@Component
public class CommonCore { 

   private final ReadProperties readProperties;

   private final SqsListener sqsListener; // this will be based on spring-cloud-starter-aws-messaging 
   @AutoWired 
   public CommonCore(SqsListener sqsListener, ReadProperties readProperties) {
       this.readProperties = readPropertis;
       this.sqsListener = sqsListener;
       Properties props = readProperties.loadCoreProperties();
       //initialize stuff
   }

   processEvents(){
     // starts processing events from a kinesis stream.
   }
}

旁注:我更喜欢尽可能通过构造函数参数使用依赖注入。这也使得单元测试更加容易,而不需要任何特定于Spring的测试库。

 类似资料:
  • 问题内容: 我正在开发一个小型Java EE Hibernate Spring应用程序,出现错误: 这是我的控制器ArticleControleur,其中包含用于恢复文章列表的功能: 这是我的articleService: 这是我的应用程序上下文: 问题答案: 该错误表明不是注册的Bean。添加其中包含将在你的应用程序上下文中自动装配的bean的软件包: 或者,如果你想将所有子包包括在com.bd

  • 这是我的当前设置:ProjectRepo: ProjectService: ProjectRestController:

  • 大家好,我收到下一个错误,我是使用Hibernate的新手

  • 4.1 根据条件的自动配置 @conditional是基于条件的自动配置,一般配合Condition接口一起使用,只有接口实现类返回true,才装配,否则不装配. 用实现了Condition接口的类传入@Conditional中 @Conditional可以标记在配置类的方法中,也可以标记在配置类上.标记的位置不同,作用域不同. @Conditional可以传入多个实现了condition接口的类

  • Spring boot提供组件扫描来查找要扫描的包。 我正在构建一个库,里面有和。还有其他类以及不同包中的原型注释。 因此,如果有人正在使用基础包开发SpringBoot Application。他在他的应用程序中使用我的库。他需要提到来发现库的原型组件。 是否有任何方法可以在不包含库包的情况下扫描组件? 由于spring-boot-starter-驱动器仅使用依赖关系公开其endpoint,而无

  • 我有以下存储库:https://github.com/vlio20/bfit,我试图使用R2DBC以异步方式执行db操作。我遵循了以下教程(但可能已经过时了https://www.youtube.com/watch?v=DvO4zLVDkMs 以下是我的pom的相关附件: 我使用的是默认配置,所以我的属性yaml中只有以下配置: 这就是我得到的错误: 组织。springframework。豆。工厂