일일구름 IT

[Spring] 의존객체 자동 주입 (@Autowired, @Resource, @Inject) 본문

Spring

[Spring] 의존객체 자동 주입 (@Autowired, @Resource, @Inject)

일구름 2023. 11. 9. 20:29

의존객체 자동 주입

- 스프링 설정 파일에서 의존 객체를 주입할때 <construct-arg>, <property> 태그로 의존 대상 객체를 명시하지 않아도 자동으로 스프링 컨테이너가 필요한 의존 대상 객체를 찾아 주입해주는 기능이다.

- 구현 방법으로는 @Autowired, @Resource 어노테이션 두 가지가 있다.

 


@Autowired

스프링 컨테이너에서 주입하고자 하는 객체의 타입과 일치하는 bean 객체를 자동으로 주입한다.

코드

// appCtxUseAutowired.xml 파일
<?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">

	<context:annotation-config />

	<bean id="wordDao" class="com.word.dao.WordDao" />
    <bean id="registerService" class="com.word.service.WordRegisterServiceUseAutowired" />
</beans>

 

원래 xml 파일과 다르게 위에 xmlns:context="http://www.springframework.org/schema/context"를 추가해주고 xsi:schemaLocation = 아래부분에 http://www.springframework.org/schema/context, http://www.springframework.org/schema/context/spring-context.xsd 두 줄을 추가해주면 된다. 

그리고 <context:annotation-config/> 태그를 추가해준다.

 

// WordRegisterServiceUseAutowired.java 파일
public class WordRegisterServiceUseAutowired {
	
    @Autowired
	public WordRegisterServiceUseAutowired(WordDao wordDao) {
		this.wordDao = wordDao;
    }
}

 

java 파일에는 의존객체를 자동으로 주입하고 싶은 부분 윗줄에 @Autowired를 적어준다.

 

 

생성자를 @Autowired를 이용해 자동 주입할때는 상관이 없지만 property나 setter 메소드에 자동주입을 하고싶은 경우에는 반드시 디폴트 생성자를 명시해주어야 한다.

디폴트 생성자가 객체를 일단 생성하고 wordDao 객체를 자동으로 끌어와야(property 자동주입) wordDao를 인자로 받는 생성자가 오류가 나지 않기 때문이다.

// WordRegisterServiceUseAutowired.java 파일
public class WordRegisterServiceUseAutowired {

	@Autowired
	private WordDao wordDao;
	
	public WordRegisterServiceUseAutowired() {
	}
	
	@Autowired
	public WordRegisterServiceUseAutowired(WordDao wordDao) {
		this.wordDao = wordDao;
	}
    
	@Autowired
	public void setWordDao(WordDao wordDao) {
		this.wordDao = wordDao;
	}
}

 

자동주입할 객체가 없는 경우

@Autowired는 같은 타입의 객체를 자동주입하는데 이때 같은 타입의 객체가 없는 경우에는 Exception이 발생하게 된다.

이 Exception이 발생하지 않게 하기위해서는 @Autowired(required = false)라고 작성해주면 된다.

@Autowired(required = false)

 

이렇게 작성을 해주면 같은 타입의 객체를 찾지 못하면 그냥 주입을 하지 않도록해 Exception이 발생하지 않는다.

 

 


@Resource

@Resource는 @Autowired와 다르게 객체의 타입이 아닌 객체의 이름이 일치하는 객체를 자동으로 주입한다.

@Resource는 생성자에는 사용하지 못하고 property나 메소드에만 사용 가능하다. 이때도 디폴트 생성자는 꼭 작성해주어야 한다.

 

 

코드

// appCtxUseResource.xml 파일
<?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">

	<context:annotation-config />

	<bean id="wordDao" class="com.word.dao.WordDao" />
    <bean id="registerService" class="com.word.service.WordRegisterServiceUseAutowired" />
</beans>

 

@Autowired를 사용할때와 xml파일의 내용은 같다.

 

// WordRegisterServiceUseResource.java 파일
public class WordRegisterServiceUseAutowired {

	@Resource
	private WordDao wordDao;
	
	public WordRegisterServiceUseAutowired() {
	}
	
	public WordRegisterServiceUseAutowired(WordDao wordDao) {
		this.wordDao = wordDao;
	}
    
	@Resource
	public void setWordDao(WordDao wordDao) {
		this.wordDao = wordDao;
	}
}

 

@Resource는 property와 메소드 위에만 사용이 가능하다. 또한 디폴트 생성자를 필수로 작성해주어야 한다.

 

 


@Inject

- @Inject 어노테이션 또한 @Autowired와 같이 의존 객체를 자동 주입할 수 있다.

- 하지만 @Autowired와 다르게 @Inject는 required 속성을 이용해서 의존 대상 객체가 없는 경우에 Exception을 피할 수 없다.

- @Inject는 required 속성을 지원하지 않기 때문이다.