Everything has an expiration date
[inflearn] 20240106 [스프링-프레임워크] - 9강 필기 본문
[inflearn] 20240106 [스프링-프레임워크] - 9강 필기
Jelly-fish 2024. 1. 7. 23:28
09강 - 의존객체 자동 주입
9-1 의존객체 자동 주입이란?
9-2 @Autowired
9-3 @Resource
9-1 의존객체 자동 주입이란?
스프링 설정 파일에서 의존 객체를 주입할 때
`<constructor-arg>` 또는 `<property>` 태그로
의존 대상 객체를 명시하지 않아도 스프링 컨테이너가 자동으로 필요한 의존 대상 객체를 찾아서
의존 대상 객체가 필요한 객체에 주입해 주는 기능이다.
구현 방법은 @Autowired 와 @Resource 어노테이션을 이용해서 쉽게 구현할 수 있다.
9-2 @Autowired
주입하려고 하는 객체의 타입이 일치하는 객체를 자동으로 주입한다.
`@Autowired` : 객체를 타입을 보고 자동으로 객체를 넣어준다.
`applicationContext.xml` 에서 `<constructor-arg>` 또는 `<property>` 태그를 사용하지 않고
아래처럼 `WordDao` 객체를 필요로 하는 생성자 위에`@Autowired` 어노테이션을 작성해 준다.
publc class WordRegisterService
{
private WordDao wordDao;
@Autowired
public WordRegisterService(WordDao wordDao)
{
this.wordDao = wordDao;
}
}
하지만, 위에서 처럼만 구성해서는 안 되고
`applicationContext.xml` 파일에서
`<context:annotation-config />` 라는 태그를 추가적으로 넣어 주어야 하는데...
이 과정에서도 `namespace`와 `schema`를 추가시켜 주어야 한다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
[추가된 내용 ①]
*************************************************************
xmlns:context="http://www.springframework.org/schema/context"
*************************************************************
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
[추가된 내용 ②]
*************************************************************
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
*************************************************************
http://www.springframework.org/schema/context/spring-context.xsd">
***************************
→ /beans/spring-beans.xsd 에서 변경됨
<context:annotation-config />
<bean id="wordDao" class="com.word.dao.WordDao" >
<!-- <qualifier value="usedDao"/> -->
</bean>
<bean id="wordDao2" class="com.word.dao.WordDao" />
<bean id="wordDao3" class="com.word.dao.WordDao" />
<bean id="registerService" class="com.word.service.WordRegisterServiceUseAutowired" />
<bean id="searchService" class="com.word.service.WordSearchServiceUseAutowired" />
</beans>
단, 주의해야 할 사항은생성자에 `@Autowired` 속성을 부여할 때는 상관이 없지만
속성 변수나, 메소드에 넣어주고 싶을 때는 반드시 디폴트 생성자를 명시해 주어야 한다.
public class WordRegisterService
{
@Autowired
private WordDao wordDao;
// ★ 반드시 디폴트 생성자 명시!
public WordRegisterService()
{
}
public WordRegisterService(WordDao wordDao)
{
this.wordDao = wordDao;
}
@Autowired
public void setWordDao(WordDao wordDao)
{
this.wordDao = wordDao;
}
}
WordRegisterService 객체가 생성이 되어야 property나 메소드에서 wordDao를 가져올 수 있기 때문에...
하지만 디폴트 생성자가 없이
매개변수로 `WordDao` 파라미터를 받는 생성자만 존재할 경우,
`wordDao`가 있어야만 WordRegisterService 객체를 생성할 수 있는데
`wordDao`를 찾을 수가 없으므로 에러가 발생하는 것이다.
9-3 @Resource
주입하려고 하는 객체의 이름이 일치하는 객체를 자동으로 주입한다.
`@Resource` : 스프링 컨테이너(IoC)에서 빈 객체 중에 객체의 이름이 동일한 객체를 찾아서
그 이름을 갖는 객체를 자동으로 주입해 준다.
`@Autowired` 와 `@Resource` 의 사용 가능 범위
구분 | @Autowired | @Resource |
Property (프로퍼티) | ◎ | ◎ |
Constructor (생성자) | ◎ | Ⅹ |
Method (메소드) | ◎ | ◎ |
publc class WordRegisterService
{
// ○ 프로퍼티에 사용 가능.
@Resource
private WordDao wordDao;
// Ⅹ!! @Resource는 생성자에 사용 불가능!
@Resource
public WordRegisterService(WordDao wordDao)
{
this.wordDao = wordDao;
}
// ○ 메소드에 사용 가능.
@Resource
public void setWordDao(WordDao wordDao)
{
this.wordDao = wordDao;
}
}
'[Inflearn] > 자바 스프링 프레임워크(renew ver.)' 카테고리의 다른 글
[inflearn] 20240106 [스프링-프레임워크] - 11강 필기 (1) | 2024.01.08 |
---|---|
[inflearn] 20240106 [스프링-프레임워크] - 10강 필기 (0) | 2024.01.08 |
[inflearn] 20240106 [스프링-프레임워크] - 8강 필기 (0) | 2024.01.07 |
[inflearn] 20240106 [스프링-프레임워크] - 6 ~ 7강 필기 (0) | 2024.01.07 |
[inflearn] 20240106 [스프링-프레임워크] - 5강 필기 (0) | 2024.01.07 |