Spring (3)

DeadWhale·2022년 8월 31일
0

Spring

목록 보기
21/25
post-thumbnail

ByType or ByName

타입으로 탑색하나 이름으로 탐색하나
그 차이점
by Name : 이름으로 탐색 (첫 글자 소문잘 바꾼게 식별자(이름)을 사용한다.
by Type : 메모리 주소 탐색

@Autowired 어노테이션
bean 클래스를 자동으로 객체를 참조해주는 코드
By Type을 찾아서 연결

@Resource 어노테이션
By Name방식으로 찾아서 연결
tomcat 9.0의 lib 폴더와 연결되야 사용 가능


@Autowired

By Type

@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으로 객체를 검색
    }

}

@Resource

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으로만 사용한것 같다.

0개의 댓글