<bean>태그에는 autowire라는 속성도 있습니다.
autowire 속성에 대한 값이 어떤게 들어가냐에 따라 출력 결과가 달라질수 있습니다.
autowire
1. byName : setter와 같은 이름의 bean(id/name) 이 있으면 자동 할당
2. byType : setter의 parameterType과 같은 type의 bean이 있으면 자동 할당
3. constructor : 생성자와 같은 이름의 bean이 있으면 자동 할당
4. default : 생성자에 할당할 수 있는지 확인 후, -> 없으면 setter에서 확인하여 할당
기본 생성자가 있으면 기본생성자 호출!
5. no : autowire속성을 안쓰겠다는 값입니다.
autowire를 테스트 해보기위해 간단한 예제를 보겠습니다.
패키지 구조
Food.java
package com.test02;
public class Food {
private String name;
private int price;
public Food() {
super();
}
public Food(String name, int price) {
super();
this.name = name;
this.price = price;
}
public void setName(String name) {
this.name = name;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return name + " \t " + price;
}
}
MyFood.java
package com.test02;
public class MyFood {
private Food favoriteFood;
private Food unFavoriteFood;
public MyFood() {
System.out.println("MyFood 기본생성자 호출!");
}
public MyFood(Food favoriteFood, Food unFavoriteFood) {
this.favoriteFood = favoriteFood;
this.unFavoriteFood = unFavoriteFood;
}
public Food getFavoriteFood() {
return favoriteFood;
}
public void setFavoriteFood(Food favoriteFood) {
this.favoriteFood = favoriteFood;
}
public Food getUnFavoriteFood() {
return unFavoriteFood;
}
public void setUnFavoriteFood(Food unFavoriteFood) {
this.unFavoriteFood = unFavoriteFood;
}
@Override
public String toString() {
return "favorite\t" + favoriteFood + "\nunFavorite\t" + unFavoriteFood;
}
}
applicationContext.xml
<?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 name="price" value="3000" />
</bean>
<bean id="unFavoriteFood" name="unFavoriteFood" class="com.test02.Food">
<constructor-arg value="번데기" />
<constructor-arg value="2000" />
</bean>
<bean id="myFood" class="com.test02.MyFood" autowire="constructor" />
</beans>
MTest.java
package com.test02;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MTest {
public static void main(String[] args) {
ApplicationContext factory = new ClassPathXmlApplicationContext("com/test02/applicationContext.xml");
MyFood my = factory.getBean("myFood", MyFood.class);
System.out.println(my);
}
}
실행결과
applicationContext.xml에서 Food타입의 객체를 만들고 MyFood타입의 객체에 Food를 주입합니다.
근데 여기서 autowire를 이용하여 값을 자동으로 찾게 됩니다.
위의 코드에서는 constructor로 autowire의 값이 주어졌습니다.
생성자와 같은 이름의 bean이 있으면 자동으로 할당하겠다는 의미인데 여기에서 id와 name 속성 두개가 있습니다.
지금까지는 계속 id로 사용했었는데 name속성도 동일한 역할을 합니다.
단, autowire의 값에 따라 조금씩 다르게 작용합니다.
오토와이어의 속성으로 byName을 준다면 setter와 같은 이름의 id나 name을 찾습니다. 즉 둘중 하나만 찾아도 자동 할당합니다.
따라서 위의 코드에서는 constructor로 값이 주어졌지만 byName으로 autowire를 설정해도 정상적으로 출력됩니다.
byType은 setter의 parameterType과 같은 type의 bean이 있으면 자동 할당하겠다는 값입니다.
위의 코드에서는 parameterType은 Food 인데 food라는 bean이 없으므로 에러가 발생하게 됩니다.
'Java 관련 > Spring Legecy' 카테고리의 다른 글
[Spring] Spring Annotation(스프링 어노테이션) (0) | 2022.03.21 |
---|---|
[Spring] DI / IoC (Bean 객체_10) - MessageSourceAware (0) | 2022.03.20 |
[Spring] DI / IoC (Bean 객체_09) - 호출 (0) | 2022.03.18 |
[Spring] DI / IoC (Bean 객체 생성_08) - <bean>태그 속성 (0) | 2022.03.17 |
[Spring] DI / IoC (Bean 객체 생성_07) - schema/c(c:), schema/p(p:) (0) | 2022.03.16 |