@Autowired vs @Resource in Spring

1. Introduction

In the Spring framework, @Autowired and @Resource are annotations used for dependency injection, which is a way to achieve Inversion of Control (IoC) by allowing the Spring container to inject dependencies into components. @Autowired is Spring's own annotation, while @Resource is specified by the JSR-250 Java standard.

2. Key Points

1. @Autowired is part of the Spring framework and injects dependencies by type.

2. @Resource is a standard annotation intended for dependency injection by name.

3. @Autowired has support for additional features such as the @Qualifier annotation for further disambiguation.

4. @Resource can be used outside of the Spring context, as it's not Spring-specific.

3. Differences

@Autowired @Resource
Spring-specific annotation. JSR-250 Java standard annotation.
Performs dependency injection by type. Performs dependency injection by name (and optionally by type).
Can be used with @Qualifier to further specify the bean to inject. Has a name attribute to indicate the specific bean to inject.
Does not need to specify a bean name unless using @Qualifier. You specify the bean name explicitly using the name attribute.

4. Example

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import javax.annotation.Resource;

public class MyService {
    // @Autowired injects by type
    @Autowired
    private MyDependency myDependency;

    // @Autowired with @Qualifier injects a specific bean by name
    @Autowired
    @Qualifier("specificDependency")
    private MyDependency anotherDependency;

    // @Resource injects by name
    @Resource(name="myResource")
    private MyDependency resourceDependency;
}

public class MyDependency {
    // Class content
}

Output:

// No output, since this is a demonstration of annotations usage.

Explanation:

1. @Autowired without @Qualifier injects the MyDependency bean based on its type.

2. @Autowired with @Qualifier("specificDependency") specifies exactly which bean should be injected when multiple beans of the same type exist.

3. @Resource(name="myResource") injects the MyDependency bean by its name.

5. When to use?

- Use @Autowired when you are working within the Spring ecosystem and want to inject dependencies by type and are okay with Spring handling the resolution.

- Use @Resource when you want to be more explicit about the bean name or when you are writing code that is possibly outside of the Spring framework.

Comments