Why IDEA Flags @Autowired but Ignores @Resource – A Deep Dive into Spring DI

This article explains the different dependency injection methods in Spring, compares @Autowired and @Resource, outlines the advantages and disadvantages of constructor, setter, and field injection, and clarifies why IntelliJ IDEA only warns about @Autowired usage.

macrozheng
macrozheng
macrozheng
Why IDEA Flags @Autowired but Ignores @Resource – A Deep Dive into Spring DI

Spring Dependency Injection (DI) approaches

Constructor injection – inject dependencies via constructor parameters.

Setter injection – inject dependencies by calling a setter method.

Field injection – inject dependencies directly on fields using @Autowired or @Resource.

Recommended usage scenarios (Spring documentation)

Constructor injection : use when the dependency is mandatory and should be immutable.

Setter injection : use for optional dependencies or when the dependency may change during the bean's lifecycle.

Field injection : generally discouraged; if unavoidable, @Resource couples less tightly to the Spring container than @Autowired.

Differences between @Autowired and @Resource

Dependency resolution : @Autowired defaults to by‑type injection and can be qualified by name with @Qualifier; @Resource defaults to by‑name and falls back to by‑type if no matching bean name is found.

Applicable targets : @Autowired can be placed on constructors, methods, parameters, and fields; @Resource can be placed only on methods and fields.

Provider : @Autowired is defined by Spring; @Resource is defined by the JSR‑250 (Java EE) specification.

Field injection is not recommended.

Drawbacks of field injection

Cannot inject immutable objects as cleanly as constructor injection.

Dependencies are hidden from the class's public API, making required collaborators less visible.

Creates tight coupling between the component and the IoC container, hindering reuse outside the container.

Unit tests must start the IoC container to instantiate the component.

When many dependencies are required, the constructor would become large, indicating a possible violation of the Single Responsibility Principle.

IDEA inspection behavior

IntelliJ IDEA flags field injection with @Autowired because it is a Spring‑specific annotation, which the IDE treats as a design concern. @Resource is a standard JSR‑250 annotation, so IDEA does not raise the same warning. Consequently, @Autowired ties code more closely to Spring, while @Resource offers better portability across compliant IoC containers.

backendSpringdependency-injection@AutowiredIDEA@Resource
macrozheng
Written by

macrozheng

Dedicated to Java tech sharing and dissecting top open-source projects. Topics include Spring Boot, Spring Cloud, Docker, Kubernetes and more. Author’s GitHub project “mall” has 50K+ stars.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.