Skip to content

Fix conditional factories #785

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Mar 29, 2025
Merged

Fix conditional factories #785

merged 7 commits into from
Mar 29, 2025

Conversation

SentryMan
Copy link
Collaborator

Now this:

@Factory
class MyServiceFactory {

  @Bean
  @RequiresProperty(value = "service.type", equalTo = "one")
  MyService myServiceOne() {
        return new MyServiceOne();
    }

  @Bean
  @RequiresProperty(value = "service.type", equalTo = "two")
  MyService myServiceTwo() {
        return new MyServiceTwo();
    }
}

will generate

  @Override
  public void build(Builder builder) {
    // create beans in order based on constructor dependencies
    // i.e. "provides" followed by "dependsOn"
    build_requires_MyServiceFactory(builder);
    build_requires_MyService(builder);
    build_requires_MyService__MyServiceFactory_build_myServiceTwo(builder);
  }

  @DependencyMeta(type = "io.avaje.inject.generator.models.valid.requires.MyServiceFactory")
  private void build_requires_MyServiceFactory(Builder builder) {
    MyServiceFactory$DI.build(builder);
  }

  @DependencyMeta(
      type = "io.avaje.inject.generator.models.valid.requires.MyService",
      method = "io.avaje.inject.generator.models.valid.requires.MyServiceFactory$DI.build_myServiceOne",
      dependsOn = {"io.avaje.inject.generator.models.valid.requires.MyServiceFactory"},
      autoProvides = {"io.avaje.inject.generator.models.valid.requires.MyService"})
  private void build_requires_MyService(Builder builder) {
    MyServiceFactory$DI.build_myServiceOne(builder);
  }

  @DependencyMeta(
      type = "io.avaje.inject.generator.models.valid.requires.MyService",
      method = "io.avaje.inject.generator.models.valid.requires.MyServiceFactory$DI.build_myServiceTwo",
      dependsOn = {"io.avaje.inject.generator.models.valid.requires.MyServiceFactory"},
      autoProvides = {"io.avaje.inject.generator.models.valid.requires.MyService"})
  private void build_requires_MyService__MyServiceFactory_build_myServiceTwo(Builder builder) {
    MyServiceFactory$DI.build_myServiceTwo(builder);
  }

Resolves #784

@SentryMan SentryMan added this to the 11.4 milestone Mar 28, 2025
@SentryMan SentryMan self-assigned this Mar 28, 2025
@SentryMan SentryMan enabled auto-merge (squash) March 28, 2025 19:47
@SentryMan SentryMan added the bug Something isn't working label Mar 28, 2025
@SentryMan SentryMan requested a review from rbygrave March 28, 2025 20:00
@SentryMan SentryMan merged commit 4fc43df into avaje:master Mar 29, 2025
7 checks passed
@SentryMan SentryMan deleted the factory-bug branch March 29, 2025 00:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Usage of @RequiresProperty on interface with different implementations
2 participants