Spring/additional

[Spring] 스프링을 통한 의존성 주입

sujin7837 2021. 2. 28. 18:13
반응형

스프링을 통한 의존성 주입-@Autowired vs. @Resource vs. <property> 태그

1) XML 설정-한 개의 빈이 id 없이 tire 인터페이스를 구현한 경우

//expert006.xml

....
<beans ...>
  <context:annotation-config />

  <bean class="expert006.KoreaTire"></bean>

  <bean id="car" class="expert006.Car"></bean>
</beans>
//Car.java-@Resource를 이용한 tire 속성 주입

public class Car {
	@Resource
    Tire tire;
    
    public String getTireBrand() {
    	return "장착된 타이어: "+tire.getBrand();
    }
}
//Car.java-@Autowired를 이용한 tire 속성 주입

public class Car {
	@Autowired
    Tire tire;
    
    public String getTireBrand() {
    	return "장착된 타이어: "+tire.getBrand();
    }
}

각각의 경우 Driver.java를 실행해보면 두 경우 모두 문제 없이 실행됩니다.

 

2) XML 설정-두 개의 빈이 id 없이 tire 인터페이스를 구현한 경우

//expert006.xml

....
<beans ...>
  <context:annotation-config />

  <bean class="expert006.KoreaTire"></bean>
  <bean class="expert006.AmericaTire"></bean>

  <bean id="car" class="expert006.Car"></bean>
</beans>

@Resource와 @Autowired를 이용한 경우 각각 문제가 발생합니다.

 

3) XML 설정-두 개의 빈이 tire 인터페이스를 구현하고 하나가 일치하는 id를 가진 경우

//expert006.xml

....
<beans ...>
  <context:annotation-config />

  <bean id="tire" class="expert006.KoreaTire"></bean>
  <bean id="tire2" class="expert006.AmericaTire"></bean>

  <bean id="car" class="expert006.Car"></bean>
</beans>

@Resource와 @Autowired를 이용한 경우 각각 정상적으로 작동합니다.

 

 

4) XML 설정-두 개의 빈이 tire 인터페이스를 구현하고 일치하는 id가 없는 경우

//expert006.xml

....
<beans ...>
  <context:annotation-config />

  <bean id="tire1" class="expert006.KoreaTire"></bean>
  <bean id="tire2" class="expert006.AmericaTire"></bean>

  <bean id="car" class="expert006.Car"></bean>
</beans>

@Resource와 @Autowired를 이용한 경우 각각 문제가 발생합니다.

 

5) XML 설정-일치하는 id가 하나 있지만 인터페이스를 구현하지 않은 경우

//expert006.xml

....
<beans ...>
  <context:annotation-config />

  <bean id="tire" class="expert006.Door"></bean>

  <bean id="car" class="expert006.Car"></bean>
</beans>
//Door.java

public class Door {

}

Door 클래스에서 tire 인터페이스를 구현하지 않았습니다.

@Resource와 @Autowired를 이용한 경우 각각 서로 다른 문제가 발생합니다.

 

  • @Autowired와 @Resource 중에서는 @Resource 추천
  • @Resource와 <property> 중에서는 <property> 추천

 

6) XML 설정-두 개의 빈이 tire 인터페이스를 구현하고 속성과 일치하는 id가 없지만 @Resource 어노테이션의 name 속성이 id와 일치하는 경우

//expert006.xml

....
<beans ...>
  <context:annotation-config />

  <bean id="tire1" class="expert006.KoreaTire"></bean>
  <bean id="tire2" class="expert006.AmericaTire"></bean>

  <bean id="car" class="expert006.Car"></bean>
</beans>
//Car.java-@Resource를 이용한 tire 속성 주입

public class Car {
	@Resource(name="tire1")
    Tire tire;
    
    public String getTireBrand() {
    	return "장착된 타이어: "+tire.getBrand();
    }
}

정상적으로 작동합니다.

 

7) 6번과 같도록 @Autowired를 지정하는 경우

//Car.java-@Autowired를 이용한 tire 속성 주입

public class Car {
	@Autowired
    @Qualifier("tire1")
    Tire tire;
    
    public String getTireBrand() {
    	return "장착된 타이어: "+tire.getBrand();
    }
}

위와 같이 @Qualifier("tire1")을 이용합니다.

 

8) 실무에서 사용하는 방식

//expert006.xml

....
<beans ...>
  <context:annotation-config />

  <bean id="tire" class="expert006.KoreaTire"></bean>
  <bean id="tireOther" class="expert006.AmericaTire"></bean>

  <bean id="car" class="expert006.Car"></bean>
</beans>
//Car.java

public class Car {
	@Resource(name="tire")
    Tire tire;
    
    public String getTireBrand() {
    	return "장착된 타이어: "+tire.getBrand();
    }
}
반응형