【问题标题】:Can springboot dependency class can autowire service module?springboot依赖类可以自动装配服务模块吗?
【发布时间】:2021-08-27 12:38:39
【问题描述】:

我可以从 spring boot 中的依赖模块调用父模块中的类吗?假设我有一个项目 A springboot 应用程序,项目 B 是依赖项(公共模块)。我能够自动装配并使用 A 中的 B 类。但反之亦然。 B 是依赖项,因此没有配置 yml 也没有给出版本。当我尝试说 Autowire aclass 时,它给了我 nulll。

【问题讨论】:

  • 你能举一个更具体的例子来说明你想做什么吗?一般来说,让模块 A 依赖于 B 而 B 依赖于 A 是一个坏主意。在这种情况下,更明智的做法是只使用一个包含两者功能的模块,或者更改你的接口,使 B 不依赖 A。

标签: java spring spring-boot pyml


【解决方案1】:

如果我理解您的问题,您有两个项目 A 和 B,其中 A 依赖于 B。从技术上讲,A 具有 B 的 maven 依赖项,因此 A 可以访问 B 的所有类。但是如果您看到,B 不会不知道 A。想想你在 POM 中添加了一个 Spring 工件来使用它的类,但这是否意味着 Spring Artifact 也可以访问你的类,不,对吗?

另外,你说 B 是一种通用模块,现在如果你让 B 依赖于 A,它可能不会保持通用。

由于您没有提供任何具体细节,我建议您尝试使用 Spring Events。使用 Spring Events,两个兄弟姐妹可以交互而无需相互依赖。看这里Spring Boot Application Events Explained

【讨论】:

    【解决方案2】:

    如果您的意思是 A 实现了 B 的接口,并且您在模块 B 中定义了接口,那么 spring 可以在 B 中包含的组件中自动装配来自 A 的实现:

    //contained in A
    @Component
    class BookRetrievalServiceImpl implements BookRetrievalService {
    
        @Override
        findBookById(String id){
            //TODO do something
        }
    }
    
    //contained in B
    interface BookRetrievalService {
        Book findBookById(String id);
    }
    
    //contained in B
    @Component
    class BookBillingService {
      private BookRetrievalService bookRetrievalService;
    
      // BookRetrievalServiceImpl gets autowired here. 
      public BookBillingService(BookRetrievalService bookRetrievalService){
       this.bookRetrievalService = bookRetrievalService;
      }
    
      public void calculateBilling(String bookId){
          //TODO retrieve book and calculate...
      }
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用 Spring bean 配置:

      例如你有一个类BClass来自你的项目B(不是Spring boot项目),你需要在你的Spring boot项目A中注入BClass,你创建一个Spring配置类/

      @Configuration
      public class AConfiguration {
      
         @Bean
         public BClass configureBClass() {
             return new BClass();
         }
      
      }
      

      然后你可以在你的 Spring boot 项目中注入BClass

      @Autowired
      BClass bClass;
      

      别忘了添加项目B作为依赖,你应该在你的Spring boot主包下创建AConfiguration类。

      【讨论】:

      • 我必须反之亦然...将A项目类注入B项目B类。
      • 如果 B 是一个 Spring boot 项目,你可以像上面提到的那样做。不过不推荐,你会得到一个循环依赖。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 2016-07-25
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多