{"id":33179524,"url":"https://github.com/avaje/avaje-inject","last_synced_at":"2026-01-23T21:27:09.115Z","repository":{"id":37977359,"uuid":"156613410","full_name":"avaje/avaje-inject","owner":"avaje","description":"Dependency injection via source code generation","archived":false,"fork":false,"pushed_at":"2026-01-19T18:33:38.000Z","size":3587,"stargazers_count":296,"open_issues_count":5,"forks_count":28,"subscribers_count":7,"default_branch":"master","last_synced_at":"2026-01-20T00:49:23.890Z","etag":null,"topics":["annotation-processing","apt","avaje","dagger","dependency-injection","di-library","dinject","inversion-of-control","jakarta-inject","java","javax-inject","kapt","kotlin"],"latest_commit_sha":null,"homepage":"https://avaje.io/inject","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/avaje.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-11-07T21:56:19.000Z","updated_at":"2026-01-19T18:33:42.000Z","dependencies_parsed_at":"2023-12-04T07:22:44.248Z","dependency_job_id":"8d54b96a-e95a-41d4-8902-2da91c81d3ad","html_url":"https://github.com/avaje/avaje-inject","commit_stats":null,"previous_names":[],"tags_count":132,"template":false,"template_full_name":null,"purl":"pkg:github/avaje/avaje-inject","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/avaje%2Favaje-inject","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/avaje%2Favaje-inject/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/avaje%2Favaje-inject/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/avaje%2Favaje-inject/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/avaje","download_url":"https://codeload.github.com/avaje/avaje-inject/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/avaje%2Favaje-inject/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28700525,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-23T17:25:48.045Z","status":"ssl_error","status_checked_at":"2026-01-23T17:25:47.153Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["annotation-processing","apt","avaje","dagger","dependency-injection","di-library","dinject","inversion-of-control","jakarta-inject","java","javax-inject","kapt","kotlin"],"created_at":"2025-11-16T03:00:36.837Z","updated_at":"2026-01-23T21:27:09.110Z","avatar_url":"https://github.com/avaje.png","language":"Java","funding_links":[],"categories":["IoC"],"sub_categories":[],"readme":"[![Discord](https://img.shields.io/discord/1074074312421683250?color=%237289da\u0026label=discord)](https://discord.gg/Qcqf9R27BR)\n[![Build](https://github.com/avaje/avaje-inject/actions/workflows/build.yml/badge.svg)](https://github.com/avaje/avaje-inject/actions/workflows/build.yml)\n[![JDK EA](https://github.com/avaje/avaje-inject/actions/workflows/jdk-ea.yml/badge.svg)](https://github.com/avaje/avaje-inject/actions/workflows/jdk-ea.yml)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/avaje/avaje-inject/blob/master/LICENSE)\n[![Maven Central](https://img.shields.io/maven-central/v/io.avaje/avaje-inject.svg?label=Maven%20Central)](https://mvnrepository.com/artifact/io.avaje/avaje-inject)\n[![javadoc](https://javadoc.io/badge2/io.avaje/avaje-inject/javadoc.svg?color=purple)](https://javadoc.io/doc/io.avaje/avaje-inject)\n\n# [Avaje-Inject](https://avaje.io/inject)\nAPT-based dependency injection for server-side developers - https://avaje.io/inject\n## Quick Start\n#### 1. Add avaje-inject as a dependency.\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003eio.avaje\u003c/groupId\u003e\n  \u003cartifactId\u003eavaje-inject\u003c/artifactId\u003e\n  \u003cversion\u003e${avaje.inject.version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n#### 2. Add avaje-inject-generator annotation processor as a dependency with provided scope.\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003eio.avaje\u003c/groupId\u003e\n  \u003cartifactId\u003eavaje-inject-generator\u003c/artifactId\u003e\n  \u003cversion\u003e${avaje.inject.version}\u003c/version\u003e\n  \u003cscope\u003eprovided\u003c/scope\u003e\n\u003c/dependency\u003e\n```\n\n#### 3. Create a Bean Class annotated with @Singleton\n```java\n@Singleton\npublic class Example {\n\n private DependencyClass d1;\n private DependencyClass2 d2;\n\n  // Dependencies must be annotated with singleton,\n  // or else be provided from another class annotated with @Factory\n  public Example(DependencyClass d1, DependencyClass2 d2) {\n    this.d1 = d1;\n    this.d2 = d2;\n  }\n}\n```\nExample factory class:\n```java\n@Factory\npublic class ExampleFactory {\n  @Bean\n  public DependencyClass2 bean() {\n    return new DependencyClass2();\n  }\n}\n```\n\n#### 4. Use BeanScope to wire and retrieve the beans and use them however you wish.\n```java\nBeanScope beanScope = BeanScope.builder().build()\nExample ex = beanScope.get(Example.class);\n```\n\n### Generated Wiring Class\nThe inject annotation processor determines the dependency wiring order and generates an `AvajeModule` class that calls all the generated DI classes.\n\n```java\n@Generated(\"io.avaje.inject.generator\")\n@InjectModule\npublic final class ExampleModule implements AvajeModule {\n\n  /**\n   * Creates all the beans in order based on constructor dependencies. The beans are registered\n   * into the builder along with callbacks for field/method injection, and lifecycle\n   * support.\n   */\n  @Override\n  public void build(Builder builder) {\n    this.builder = builder;\n    // create beans in order based on constructor dependencies\n    // i.e. \"provides\" followed by \"dependsOn\"\n    build_example_ExampleFactory(builder);\n    build_example_DependencyClass(builder);\n    build_example_DependencyClass2(builder);\n    build_example_Example(builder);\n  }\n\n  @DependencyMeta(type = \"org.example.ExampleFactory\")\n  private void build_example_ExampleFactory(Builder builder) {\n    ExampleFactory$DI.build(builder);\n  }\n\n  @DependencyMeta(type = \"org.example.DependencyClass\")\n  private void build_example_DependencyClass(Builder builder) {\n    DependencyClass$DI.build(builder);\n  }\n\n  @DependencyMeta(\n      type = \"org.example.DependencyClass2\",\n      method = \"org.example.ExampleFactory$DI.build_bean\", // factory method\n      dependsOn = {\"org.example.ExampleFactory\"}) //factory beans naturally depend on the factory\n  private void build_example_DependencyClass2(Builder builder) {\n    ExampleFactory$DI.build_bean(builder);\n  }\n\n  @DependencyMeta(\n      type = \"org.example.Example\",\n      dependsOn = {\"org.example.DependencyClass\", \"org.example.DependencyClass2\"})\n  private void build_example_Example(Builder builder) {\n    Example$DI.build(builder);\n  }\n}\n```\n\n## Similar to [Dagger](https://google.github.io/dagger/)\n\n- Uses Java annotation processing for dependency injection\n- Generates source code\n- Avoids any use of reflection or classpath scanning (so low overhead and fast startup)\n\n## Differences to Dagger\n\n- Specifically aimed for server-side development (rather than Android)\n- Supports \"component testing\" via `avaje-inject-test` and `@InjectTest`\n- Provides an API to obtain all bean instances that implement an interface\n- Lifecycle methods with `@PostConstruct` and `@PreDestroy`\n- Spring-like factory classes with `@Factory` and `@Bean`\n- Conditional Wiring based on active profiles or existing beans/properties\n\n## DI Framework comparison\n\n|  Avaje | Dagger | Spring\n| :--- | :---  | :---  |\n| [@Singleton](https://avaje.io/inject/#singleton) | @Singleton | @Component, @Service, @Repository |\n| [Provider\u0026lt;T\u003e](https://avaje.io/inject/#provider) | Provider\u0026lt;T\u003e | FactoryBean\u0026lt;T\u003e\n| [@Inject](https://avaje.io/inject/#inject) | @Inject | @Inject, @Autowired\n| [@Inject @Nullable](https://avaje.io/inject/#nullable) or [@Inject Optional\u0026lt;T\u003e](https://avaje.io/inject/#optional) | @Inject @Nullable | @Autowired(required=false)\n| [@Qualifier/@Named](https://avaje.io/inject/#qualifiers) | @Qualifier/@Named | @Qualifier\n| [@AssistFactory](https://avaje.io/inject/#assistInject) | @AssistedFactory | - |\n| [@PostConstruct](https://avaje.io/inject/#post-construct) | - | @PostConstruct\n| [@PreDestroy](https://avaje.io/inject/#pre-destroy) | - | @PreDestroy\n| [@Factory and @Bean](https://avaje.io/inject/#factory) | - | @Configuration and @Bean\n| [@RequiresBean and @RequiresProperty](https://avaje.io/inject/#conditional) | - | @Conditional\n| [@Lazy](https://avaje.io/inject/#lazy) | - | @Lazy\n| [@Prototype](https://avaje.io/inject/#prototype) | - | @Scope(\"prototype\")\n| [@Primary](https://avaje.io/inject/#primary) | - | @Primary\n| [@Secondary](https://avaje.io/inject/#secondary) | - | @Fallback\n| [@InjectTest](https://avaje.io/inject/#component-testing) | - | @SpringBootTest\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Favaje%2Favaje-inject","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Favaje%2Favaje-inject","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Favaje%2Favaje-inject/lists"}