ByType or ByName
타입으로 탑색하나 이름으로 탐색하나
그 차이점
by Name : 이름으로 탐색 (첫 글자 소문잘 바꾼게 식별자(이름)을 사용한다.
by Type : 메모리 주소 탐색
@Autowired 어노테이션
bean 클래스를 자동으로 객체를 참조해주는 코드
By Type을 찾아서 연결
@Resource 어노테이션
By Name방식으로 찾아서 연결
tomcat 9.0의 lib 폴더와 연결되야 사용 가능
@Component
class Car {
@Autowired
Engine engine;
@Autowired
Door door;
@Override
public String toString() {
return "Car{" +
"engine=" + engine +
", door=" + door +
'}';
}
}
public class Main4 {
public static void main(String[] args) throws Exception {
AppContext ac = new AppContext();
Car car = (Car) ac.getBean("car");
Engine engine = (Engine) ac.getBean("engine");
Door door= (Door) ac.getBean(Door.class);
// car.engine = engine;
// car.door = door;
System.out.println("car : " + car); // by Name으로 객체를 검색
System.out.println("door : " + door); // by Name으로 객체를 검색
System.out.println("engine : " + engine); // by Name으로 객체를 검색
}
}
주입된 속성의 이름으로 추적
private void doResource() {
//map에 저장된 객체의 iv중 @Resource 붙어있으면
//map에서 iv타입의 맞는 객체를 찾아 연결 (객체의 주소를 iv에 저장)
try {
for( Object obj : map.values()){
for (Field fld : obj.getClass().getDeclaredFields()){
if(fld.getAnnotation(Resource.class) != null){//by Name
fld.set(obj, getBean(fld.getName())); // car.engine = obj;
}
}
}
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
이게 말은 간단한게 잘 이해가 안가서 구글에서 검색해 어느 정도 이해할만한 게시글을 약간 인용하자면
by Type은 자동으로 bean으로 등록된 형식을 찾아 반환해준다
depandency - injection - context.xml에 중복되는 형식이 있으면 primary 형식을 반환해준다
by name은 주입된 이름을 첫 글자를 약칭으로 등록된 bean을 탐색하여 형식을 반환해준다.
근대 이건 잘 모르겟다 첫글자로 하면 중복되는 경우가 문제되는거 같은데 이거에 대한 설명을 잘 찾지을 못했다근대 모두 공통적으로 @Autowired를 권고한다고 작성되어 있었다 내가 사용한 프로젝트에서도 by Type으로만 사용한것 같다.