Loading...
Spring Framework Reference Documentation 7.0.2의 Injection with @Resource의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
@ResourceSpring은 또한 field나 bean property setter 메서드에 JSR-250 @Resource 어노테이션
(jakarta.annotation.Resource)을 사용하여 injection을 지원합니다.
이는 Jakarta EE에서 일반적인 패턴입니다. 예를 들어, JSF-managed bean과 JAX-WS
endpoint에서 사용됩니다.
Spring은 Spring-managed 객체에 대해서도 이 패턴을 지원합니다.
@Resource는 name attribute를 가집니다. 기본적으로 Spring은 그 값을
주입할 bean name으로 해석합니다. 다시 말해, 다음 예제에서 보듯이
by-name semantics를 따릅니다:
1public class SimpleMovieLister { 2 3 private MovieFinder movieFinder; 4 5 @Resource(name="myMovieFinder") // (1) 6 public void setMovieFinder(MovieFinder movieFinder) { 7 this.movieFinder = movieFinder; 8 } 9}
| 1 | 이 line은 @Resource를 inject합니다. |
1class SimpleMovieLister { 2 3 @Resource(name="myMovieFinder") // (1) 4 private lateinit var movieFinder: MovieFinder 5}
| 1 | 이 line은 @Resource를 inject합니다. |
name이 명시적으로 지정되지 않으면, 기본 name은 field name이나 setter 메서드에서 유도됩니다. field의 경우 field name을 사용합니다. setter 메서드의 경우 bean property name을 사용합니다.
다음 예제는 bean
movieFinder가 그 setter 메서드에 주입되도록 합니다:
1public class SimpleMovieLister { 2 3 private MovieFinder movieFinder; 4 5 @Resource 6 public void setMovieFinder(MovieFinder movieFinder) { 7 this.movieFinder = movieFinder; 8 } 9}
1class SimpleMovieLister { 2 3 @set:Resource 4 private lateinit var movieFinder: MovieFinder 5 6}
어노테이션으로 제공된 name은
CommonAnnotationBeanPostProcessor가 인지하고 있는ApplicationContext에 의해 bean name으로 resolve됩니다. Spring의SimpleJndiBeanFactory를 명시적으로 설정하면 JNDI를 통해 name을 resolve할 수 있습니다. 그러나 우리는 기본 동작에 의존하고 Spring의 JNDI lookup 기능을 사용하여 간접화 수준을 유지할 것을 권장합니다.
@Resource 사용에서 name을 명시적으로 지정하지 않은 배타적인 경우에,
그리고 @Autowired와 유사하게, @Resource는 특정 named bean 대신
primary type match를 찾고 잘 알려진 resolvable dependency들인
BeanFactory, ApplicationContext, ResourceLoader, ApplicationEventPublisher,
MessageSource 인터페이스들을 resolve합니다.
따라서 다음 예제에서 customerPreferenceDao field는 먼저
"customerPreferenceDao"라는 name의 bean을 찾고, 그런 다음
type CustomerPreferenceDao에 대한 primary type match로 fallback합니다:
1public class MovieRecommender { 2 3 @Resource 4 private CustomerPreferenceDao customerPreferenceDao; 5 6 @Resource 7 private ApplicationContext context; // (1) 8 9 public MovieRecommender() { 10 } 11 12 // ... 13}
| 1 | context field는 알려진 resolvable dependency type인<br>ApplicationContext에 기반하여 inject됩니다. |
1class MovieRecommender { 2 3 @Resource 4 private lateinit var customerPreferenceDao: CustomerPreferenceDao 5 6 @Resource 7 private lateinit var context: ApplicationContext // (1) 8 9 // ... 10}
| 1 | context field는 알려진 resolvable dependency type인<br>ApplicationContext에 기반하여 inject됩니다. |
Using CustomAutowireConfigurer
Using @Value