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.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ