2020/05/30 - [🌎Web Application/Spring] - [Spring] DI (Dependency Injection) part 1
2020/05/30 - [🌎Web Application/Spring] - [Spring] DI (Dependency Injection) part 2
2020/05/30 - [🌎Web Application/Spring] - [Spring] DI (Dependency Injection) part 3
2020/05/30 - [🌎Web Application/Spring] - [Spring] DI (Dependency Injection) part 4
public class Food {
private String name;
private int price;
public Food() {
super();
// TODO Auto-generated constructor stub
}
... 이하생략
}
package com.test02;
public class MyFood {
private Food favoriteFood;
private Food unFavoriteFood;
public MyFood() {
super();
// TODO Auto-generated constructor stub
}
public MyFood(Food favoriteFood, Food unFavoriteFood) {
super();
this.favoriteFood = favoriteFood;
this.unFavoriteFood = unFavoriteFood;
}
... 이하 생략.
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">
<bean id="favoriteFood" name="favoriteFood" class="com.test02.Food">
<property name="name" value="김치볶음밥"></property>
<property name="price" value="6900"></property>
</bean>
<bean id="unFavoriteFood" name="unFavorite" class="com.test02.Food">
<property name="name" value="민트초코"></property>
<property name="price" value="3000"></property>
</bean>
<bean id="myFoodByName" class="com.test02.MyFood" autowire="byName"></bean>
<!-- 예외발생!
<bean id="myFoodByType" class="com.test02.MyFood" autowire="byType"></bean>
-->
<bean id="myFoodConstructor" class="com.test02.MyFood" autowire="constructor"></bean>
<bean id="myFoodDefault" class="com.test02.MyFood" autowire="default"></bean>
</beans>
스프링은 의존하는 빈 객체의 타입이나 이름을 이용하여 의존 객체를 자동으로 설정할 수 있는 기능을 제공한다.
(이때, MyFood는 Food에 의존한다. 왜냐하면, 클래스 멤버변수 타입이 Food인 타입이 존재하며, setter와 생성자로 외부에서 Food를 주입받기 때문.)
( 1 ) byName
property의 이름 (==setter의 이름 // 예를들어, 해당 setter가 setterMoneyCount일 때, setter의 이름은 moneyCount가 된다.)과 같은 이름을 갖는 빈 객체를 설정.
ex) myFood의 property들의 name은 favoriteFood와 unFavoriteFood이다.
그러므로 자동으로 name이 favoriteFood,unFavoriteFood인 bean들을 주입한다.
하지만 name이 unFavoriteFood가 아닌 unFavorite인데 왜 주입되는 것인가?
그 이유는, name뿐만 아니라 id도 비교하기 때문이다.
==> 요약하자면, setter와 같은 이름(id or name)의 bean이 있으면 자동으로 할당된다.
( 2 ) byType
property의 타입과 같은 타입을 갖는 빈 객체를 설정
setter의 parameterType과 같은 type의 bean이 있으면 자동으로 할당된다.
하지만, 동일한 타입의 bean객체가 두 개 이상 존재하게 되면, spring은 어떤 bean객체를 사용할 지 알 수 없기 때문에
예외를 발생시킨다.
( 3 ) constructor
생성자의 parameter와 같은 type의 bean이 있으면 자동 할당, id/name으로 호출
byType과 차이점은, byType은 parameter의 type을 사용하지만, constructor는 생성자의 parameter Type을 사용한다.
하지만, byType과 같이 , 동일한 타입의 bean객체가 생성자의 매개변수 타입의 개수보다 많을 시 오류가 난다.
( 4 ) default
생성자에 할당할 type이 있는지 확인 후 (constructor) -> 없으면 parameter type 에 type이 있는지 할당(byType)
==> constructor 방식을 먼저 적용하고, byType 방식을 적용하여 의존 객체를 설정
'⚙️Backend > Spring' 카테고리의 다른 글
[Spring] AOP(Aspect Oriented Programming) part 1 (0) | 2020.05.30 |
---|---|
[Spring] DI (Dependency Injection) part 6 (0) | 2020.05.30 |
[Spring] DI (Dependency Injection) part 4 (0) | 2020.05.30 |
[Spring] DI (Dependency Injection) part 3 (0) | 2020.05.30 |
[Spring] DI (Dependency Injection) part 2 (0) | 2020.05.30 |