Meaning of @Resource annotation
First of all, to understand the point of @Resource
you need to understand the Inversion of Control (IoC).
Inversion of Control is a principle in software development which goes that the control of objects should be transferred to a container or a framework.
Dependency Injection (DI) is a pattern of IoC implementation, where the control being inverted is the setting of object’s dependencies. The act of composing objects with other objects (injecting) is done by a container rather than by the objects themselves.
Using a DI framework (like Spring IoC
or EJB
) you're creating your POJOs and configuring the framework (a POJO configured such way called a Bean
). A Bean
may have different scopes, like singleton (1 object instance per container), prototype (creates a new instance of an object per injection or explicit call) and etc.
So far, so good. What's next? It's time to use our beans.
@Resource
is the annotation that will help to extract beans from the container.
There are several lookup options to extract beans:
- Match by Name
- Match by Type
- Match by Qualifier
Using @Resource
without any parameters will trigger Match by Type lookup type.
There is an example of usage or @Resource
with field injection and Spring framework with Java-based configuration and Match by Name:
@Configuration
public class ApplicationContext {
// Put the bean into the spring container
@Bean(name = "userFile")
public File userFile() {
File file = new File("user.txt");
return file;
}
}
@Service
class UserService {
// Ask the container to get the bean and 'put' it here (inject)
@Resource(name = "userFile")
private File userFile;
}
@Resource
is usually used to inject data sources, singleton services, context configurations and etc.