728x90
반응형
Autowire
1. byName: setter와 같은 이름의 bean이 있으면 자동 할당
2. byType: setter의 parameter type과 같은 type의 bean이 있으면 자동 할당
3. constructor: 생성자의 parameter와 같은 type의 bean이 있으면 자동 할당(id or name으로 호출)
4. default: 생성자에 할당할 type이 있는지 확인 후 (constructor) 기본생성자 -> 없으면 메서드에서 type이 있는지 확인하여 할당(byType)
▶︎ 일반적으로 객체를 변수로 선언한 클래스에 값을 넣고 생성하는 경우는 아래와 같이
setter 주입(property) 또는 생성자주입(constructor)로 값을 넣어주고 ref를 통해 생성해 줄 수 있다.
※ 이때 ref는 id값과 name값 두가지 모두로 호출할 수 있다.
<?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.test03.Food">
<property name="name" value="회"/>
<property name="price" value="20000"/>
</bean>
<bean id="unFavorite" name="unFavoriteFood" class="com.test03.Food">
<constructor-arg value="해물찜"/>
<constructor-arg value="25000"/>
</bean>
<!-- ref할때 name/ id값 둘 다 됨 -->
<bean id="myFood" class="com.test03.MyFood">
<property name="favoriteFood" ref="favoriteFood"/>
<property name="unFavoriteFood" ref="unFavorite"/>
</bean>
</beans>
package com.test03;
public class Food {
private String name;
private int price;
public Food() {
}
public Food(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return name+ "\t " + price;
}
}
package com.test03;
public class MyFood {
private Food favoriteFood;
private Food unFavoriteFood;
public MyFood() {
}
public MyFood(Food favoriteFood, Food unFavoriteFood) {
super();
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 "favoriteFood: " + favoriteFood + "\nunFavoriteFood: " + unFavoriteFood;
}
}
package com.test03;
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/test03/applicationContext.xml");
MyFood my = factory.getBean("myFood", MyFood.class);
System.out.println(my);
}
}
1. byName
<bean id="myFood" class="com.test03.MyFood" autowire="byName"/>
같은 name값으로 자동 할당한다.
▶︎결과값
favoriteFood: 회 20000
unFavoriteFood: 해물찜 25000
2. byType
<bean id="myFood" class="com.test03.MyFood" autowire="byName"/>
byType으로 했을 때는 setter의 파라미터 타입과 동일한 bean을 자동할당 하기 때문에,
여러개의 대상이 있는 경우, NoUniqueBeanDefinitionException에러가 발생한다.
3. constructor
<bean id="myFood" class="com.test03.MyFood" autowire="constructor"/>
생성자의 파라미터와 같은 타입의 bean이 있으면 자동으로 id 또는 name으로 호출하여 할당한다.
▶︎결과값
favoriteFood: 회 20000
unFavoriteFood: 해물찜 25000
4. default
<bean id="myFood" class="com.test03.MyFood" autowire="default"/>
생성자에 할당할 타입 확인후 'constructor'로 기본생성자를 만드는데 만일 없다면 메서드에서 타입을 확인 후 byType으로 할당한다.
여기서는 만들어 놓은 기본생성자가 있었기 때문에 기본생성자로 만들어지지만 넣을 값이 여러개 이기 때문에 어떤걸 입력해야 할지 몰라 set 되지 않고 값은 null로 뜬다. 만일 기본생성자가 없다면 여러개 값은 상태에서 byType으로 넘어가며 NoUnique에러가 뜰 것이다.
▶︎결과값
favoriteFood: null
unFavoriteFood: null
728x90
반응형
'Web > Spring' 카테고리의 다른 글
[Spring]Annotation (0) | 2020.10.28 |
---|---|
[Spring]AOP_관점지향 프로그래밍 (0) | 2020.10.27 |
[Spring]MessageSourceAware (0) | 2020.10.23 |
[Spring]constructor injection_setter injection (0) | 2020.10.23 |
[Spring]Maven (0) | 2020.10.22 |