Spring также поддерживает внедрение зависимостей с помощью аннотации @Resource из JSR-250 (javax.annotation.Resource) для полей или сеттеров свойств бина. Это распространенный шаблон в Java EE: например, в JSF-управляемых бинах и конечных точках JAX-WS. Spring поддерживает этот шаблон и для объектов, управляемых Spring.

@Resource принимает атрибут имени. По умолчанию Spring интерпретирует это значение как имя внедряемого бина. Другими словами, он следует семантике по имени, как показано в следующем примере:

Java
public class SimpleMovieLister {
    private MovieFinder movieFinder;
    @Resource(name="myMovieFinder")
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }
}
  1. Эта строка внедряет @Resource.
Kotlin
class SimpleMovieLister {
    @Resource(name="myMovieFinder")
    private lateinit var movieFinder:MovieFinder
}
  1. Эта строка внедряет @Resource.

Если имя не задано явно, из имени поля или сеттера выбирается имя по умолчанию. Если это поле, то принимается имя поля. Если это сеттер, то принимается имя свойства бина. В следующем примере показано, что бин с именем movieFinder будет внедрен в сеттер:

Java
public class SimpleMovieLister {
    private MovieFinder movieFinder;
    @Resource
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }
}
Kotlin
class SimpleMovieLister {
    @set:Resource
    private lateinit var movieFinder: MovieFinder
}
Имя, указанное с аннотацией, разрешается как имя бина в ApplicationContext, о котором знает CommonAnnotationBeanPostProcessor. Имена могут быть разрешены через JNDI, если вы явно настроите SimpleJndiBeanFactory фреймворка Spring. Однако мы рекомендуем вам полагаться на логику работы по умолчанию и использовать возможности Spring по поиску с помощью JNDI для сохранения уровня косвенности.

В исключительном случае использования @Resource без явного указания имени и аналогично @Autowired, @Resource находит соответствие первичного типа вместо конкретного именованного бина и разрешает известные разрешимые зависимости: интерфейсы BeanFactory, ApplicationContext, ResourceLoader, ApplicationEventPublisher и MessageSource.

Таким образом, в следующем примере поле customerPreferenceDao сначала ищет бин с именем "customerPreferenceDao", а затем возвращается к первичному сопоставлению типов для типа CustomerPreferenceDao:

Java
public class MovieRecommender {
    @Resource
    private CustomerPreferenceDao customerPreferenceDao;
    @Resource
    private ApplicationContext context;
    public MovieRecommender() {
    }
    // ...
}
  1. Поле context внедряется на основе известного разрешаемого типа зависимости: ApplicationContext.
Kotlin
class MovieRecommender {
    @Resource
    private lateinit var customerPreferenceDao: CustomerPreferenceDao
    @Resource
    private lateinit var context: ApplicationContext
    // ...
}
  1. Поле context внедряется на основе известного разрешаемого типа зависимости: ApplicationContext.