Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
giuseppe-trisciuoglio avatar

Spring Boot Dependency Injection

  • 1.7k installs
  • 311 repo stars
  • Updated June 22, 2026
  • giuseppe-trisciuoglio/developer-kit

Constructor-first dependency injection patterns with explicit handling of mandatory and optional collaborators, validated via minimal context tests.

About

This skill teaches constructor-first dependency injection patterns for Spring Boot applications, covering mandatory collaborators via constructors, optional dependencies via ObjectProvider or no-op implementations, bean selection with @Primary and @Qualifier, and validation through minimal context tests. Developers use it when building new @Service, @Component, @Repository, or @Configuration classes, refactoring legacy field injection code, resolving ambiguous bean wiring, or troubleshooting Spring context startup failures. Key workflows include separating mandatory from optional dependencies, keeping wiring logic in @Configuration classes, and testing services without Spring containers before integration testing.

  • Constructor injection for mandatory dependencies with final fields; no @Autowired needed for single constructors
  • ObjectProvider<T> for lazy optional dependencies; no-op implementations and @ConditionalOnProperty for feature flags
  • @Primary for default beans; @Qualifier for named variants; keep selection rules in configuration classes
  • Minimal context tests to validate bean loading before full @SpringBootTest; unit tests without Spring container
  • Avoid field injection, nullable collaborators, and circular dependencies; keep framework logic out of business code

Spring Boot Dependency Injection by the numbers

  • 1,673 all-time installs (skills.sh)
  • +55 installs in the week ending Jul 28, 2026 (Skillselion tracking)
  • Ranked #278 of 4,386 Backend & APIs skills by installs in the Skillselion catalog
  • Security screen: MEDIUM risk (skills.sh audit)
  • Data as of Jul 28, 2026 (Skillselion catalog sync)
At a glance

spring-boot-dependency-injection capabilities & compatibility

Capabilities
design constructor first dependency injection pa · resolve multiple beans with @primary and @qualif · handle optional dependencies with objectprovider · validate spring wiring with minimal context test · refactor field injection to constructor injectio
Use cases
api development · testing · refactoring
Platforms
macOS · Windows · Linux
Runs
Runs locally
From the docs

What spring-boot-dependency-injection says it does

Provides constructor-first dependency injection patterns for Spring Boot
SKILL.md
Mandatory collaborators belong in the constructor.
SKILL.md
npx skills add https://github.com/giuseppe-trisciuoglio/developer-kit --skill spring-boot-dependency-injection

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs1.7k
repo stars311
Security audit3 / 3 scanners passed
Last updatedJune 22, 2026
Repositorygiuseppe-trisciuoglio/developer-kit

What it does

Design and validate Spring Boot dependency injection patterns for services and configurations using constructor-first wiring.

Who is it for?

Building new Spring Boot services; refactoring legacy field injection; resolving bean selection conflicts; designing for testability.

Skip if: Simple scripts or one-off utilities; frameworks without Spring dependency injection.

When should I use this skill?

Creating @Service, @Component, @Repository, or @Configuration classes; troubleshooting Spring context failures; removing field injection.

What you get

Services and configurations with clear, testable dependency graphs; reduced Spring startup failures and improved unit test isolation.

  • Constructor-injected service or configuration class
  • Wiring validation test
  • Documented bean selection strategy

By the numbers

  • 6 core instructions covering separation, defaults, optional handling, selection, configuration, and validation
  • 3 complete examples: constructor-first service, optional dependency with no-op, multiple beans with @Primary/@Qualifier

Files

SKILL.mdMarkdownGitHub ↗

Spring Boot Dependency Injection

Overview

Provides constructor-first dependency injection patterns for Spring Boot:

  • mandatory collaborators via constructor injection
  • optional collaborators via ObjectProvider or no-op fallbacks
  • bean selection via @Primary and @Qualifier
  • validation via minimal context tests before full integration

When to Use

Use this skill when:

  • creating a new @Service, @Component, @Repository, or @Configuration class
  • replacing field injection in legacy Spring code
  • resolving multiple beans of the same type with qualifiers or primary beans
  • handling optional features, adapters, or integrations without null-driven wiring
  • reviewing circular dependencies or brittle context startup failures
  • preparing code for direct constructor-based unit testing

Instructions

1. Separate mandatory and optional collaborators

For each class, identify:

  • mandatory collaborators required for correct behavior
  • optional collaborators that enable integrations, caching, notifications, or feature-flagged behavior

Mandatory collaborators belong in the constructor. Optional ones need an explicit strategy such as ObjectProvider, conditional beans, or a no-op implementation.

2. Default to constructor injection

For application services and adapters:

  • inject mandatory dependencies through the constructor
  • keep injected fields final
  • instantiate the class directly in unit tests without starting Spring

A single constructor is usually enough; @Autowired is unnecessary in that case.

3. Resolve optional behavior intentionally

Good options include:

  • ObjectProvider<T> when lazy access is useful
  • @ConditionalOnProperty or @ConditionalOnMissingBean when wiring should change by configuration
  • a no-op implementation when the caller should not care whether the feature is enabled

Avoid nullable collaborators that leave runtime behavior ambiguous.

4. Use bean selection annotations only when needed

When multiple beans share the same type:

  • use @Primary for the default implementation
  • use @Qualifier for named variants
  • keep the qualifier names stable and easy to grep

If selection rules become complex, move them into a dedicated configuration class instead of spreading them across services.

5. Keep wiring in configuration, not business code

Use @Configuration and @Bean methods when:

  • the object comes from a third-party library
  • conditional creation logic is needed
  • you need environment-specific wiring or explicit composition

Business services should not know how infrastructure collaborators are instantiated.

6. Validate wiring explicitly

After writing a new service or configuration:

1. Verify the bean loads with a minimal context test:

   @SpringBootTest
   @ContextConfiguration(classes = UserService.class)
   class UserServiceWiringTest {
       @Autowired UserService userService;
       @Test void serviceIsInstantiated() { assertNotNull(userService); }
   }

2. Run constructor-based unit tests for service behavior (no Spring needed). 3. Add slice tests only when MVC, JPA, or messaging integration must be verified. 4. Reserve `@SpringBootTest` for container-wide wiring validation.

Failures at step 1 indicate wiring issues before business logic is added.

Examples

Example 1: Constructor-first application service

@Service
public class UserService {

    private final UserRepository userRepository;
    private final EmailSender emailSender;

    public UserService(UserRepository userRepository, EmailSender emailSender) {
        this.userRepository = userRepository;
        this.emailSender = emailSender;
    }

    public User register(UserRegistrationRequest request) {
        User user = userRepository.save(User.from(request));
        emailSender.sendWelcome(user);
        return user;
    }
}

This class is easy to instantiate directly in a unit test with mocks.

Example 2: Optional dependency with a no-op fallback

@Service
public class ReportService {

    private final ReportRepository reportRepository;
    private final NotificationGateway notificationGateway;

    public ReportService(
        ReportRepository reportRepository,
        ObjectProvider<NotificationGateway> notificationGatewayProvider
    ) {
        this.reportRepository = reportRepository;
        this.notificationGateway = notificationGatewayProvider.getIfAvailable(NotificationGateway::noOp);
    }
}

This keeps optional behavior explicit without leaking null handling through the rest of the class.

Example 3: Multiple beans with clear selection

@Configuration
public class PaymentConfiguration {

    @Bean
    @Primary
    PaymentGateway stripeGateway() {
        return new StripePaymentGateway();
    }

    @Bean
    @Qualifier("fallbackGateway")
    PaymentGateway mockGateway() {
        return new MockPaymentGateway();
    }
}

Use @Primary for the default path and @Qualifier only where a specific variant is required.

Best Practices

  • Prefer constructor injection for mandatory dependencies.
  • Keep service constructors small; if a class needs too many collaborators, the design probably wants another abstraction.
  • Use no-op or conditional beans instead of nullable optional dependencies.
  • Keep framework-specific creation logic in configuration classes.
  • Test services without Spring first, then add container tests only where they add value.
  • Remove field injection during refactors instead of extending it.

Constraints and Warnings

  • Field injection hides dependencies and makes tests harder to write.
  • Circular dependencies are usually a design problem, not a wiring trick to solve with @Lazy.
  • Overusing qualifiers can make the codebase hard to reason about; prefer better abstractions or clearer configuration.
  • Optional collaborators still need deterministic behavior when absent.
  • Full-context tests can hide the real source of wiring failures if used too early.

References

  • references/reference.md
  • references/examples.md
  • references/spring-official-dependency-injection.md

Related Skills

  • spring-boot-crud-patterns
  • spring-boot-rest-api-standards
  • unit-test-service-layer

Related skills

How it compares

Choose Spring Boot Dependency Injection over generic Java skills when you need Spring-specific @Service wiring and Lombok constructor injection patterns.

FAQ

When should I use ObjectProvider instead of @Autowired?

Use ObjectProvider<T> for optional dependencies where lazy access or conditional presence is useful; it avoids null and makes intent explicit.

What is the difference between @Primary and @Qualifier?

@Primary designates the default bean when no qualifier is specified; @Qualifier names a specific variant for explicit selection.

How do I test a service with dependencies without Spring?

Instantiate the service directly in a unit test with mocks of its constructor parameters; no container needed.

Is Spring Boot Dependency Injection safe to install?

skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.

Backend & APIsbackendtesting

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.