Spring также поддерживает внедрение зависимостей с помощью аннотации @Resource
из JSR-250 (javax.annotation.Resource
) для полей или сеттеров свойств бина. Это распространенный шаблон в Java EE: например, в JSF-управляемых бинах и конечных точках JAX-WS. Spring поддерживает этот шаблон и для объектов, управляемых Spring.
@Resource
принимает атрибут имени. По умолчанию Spring интерпретирует это значение как имя внедряемого бина. Другими словами, он следует семантике по имени, как показано в следующем примере:
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Resource(name="myMovieFinder")
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
}
- Эта строка внедряет
@Resource
.
class SimpleMovieLister {
@Resource(name="myMovieFinder")
private lateinit var movieFinder:MovieFinder
}
- Эта строка внедряет
@Resource
.
Если имя не задано явно, из имени поля или сеттера выбирается имя по умолчанию. Если это поле, то принимается имя поля. Если это сеттер, то принимается имя свойства бина. В следующем примере показано, что бин с именем movieFinder
будет внедрен в сеттер:
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Resource
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
}
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
:
public class MovieRecommender {
@Resource
private CustomerPreferenceDao customerPreferenceDao;
@Resource
private ApplicationContext context;
public MovieRecommender() {
}
// ...
}
- Поле
context
внедряется на основе известного разрешаемого типа зависимости:ApplicationContext
.
class MovieRecommender {
@Resource
private lateinit var customerPreferenceDao: CustomerPreferenceDao
@Resource
private lateinit var context: ApplicationContext
// ...
}
- Поле
context
внедряется на основе известного разрешаемого типа зависимости:ApplicationContext
.