Spring IoC контейнер: конфигурация на основе аннотаций, @Resource

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

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

Java

public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Resource(name="myMovieFinder") 
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }
}

Kotlin

class SimpleMovieLister {

    @Resource(name="myMovieFinder") 
    private lateinit var movieFinder:MovieFinder
}

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

Java

public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Resource
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }
}

Kotlin

class SimpleMovieLister {

    @Resource
    private lateinit var movieFinder: MovieFinder

}

Имя, предоставленное аннотацией, разрешается как имя компонента с помощью ApplicationContext, о котором знает CommonAnnotationBeanPostProcessor. Имена могут быть разрешены с помощью JNDI, если вы настроите Spring SimpleJndiBeanFactory явно. Однако рекомендуется полагаться на поведение по умолчанию и использовать возможности поиска JNDI в Spring для сохранения уровня косвенности.

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

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

Java

public class MovieRecommender {

    @Resource
    private CustomerPreferenceDao customerPreferenceDao;

    @Resource
    private ApplicationContext context; 

    public MovieRecommender() {
    }

    // ...
}

Kotlin

class MovieRecommender {

    @Resource
    private lateinit var customerPreferenceDao: CustomerPreferenceDao


    @Resource
    private lateinit var context: ApplicationContext 

    // ...
}

Поле context вводится на основе известного разрешаемого типа зависимости: ApplicationContext.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки