Burninghering's Blog
article thumbnail

 

객체 찾기

1. 이름으로 찾기 - Map의 Key로 찾기 (객체 주소 반환)

2. 타입으로 찾기 - Map의 Value로 찾기 (객체 반환)

<java />
Object getBean(String key){ return map.get(key); } //By Type 검색 Object getBean(Class clazz) { for (Object obj : map.values()) { //map의 모든 value를 가져와서 if (clazz.isInstance(obj)) //obj가 class의 객체거나 자손이면 true가 됨 return obj; } return null; } } public class Main3 { public static void main(String[] args) throws Exception { AppContext ac = new AppContext(); Car car = (Car) ac.getBean("car"); //byName으로 객체를 검색 Car car2 = (Car) ac.getBean(Car.class); //byType으로 객체를 검색 Engine engine = (Engine) ac.getBean("engine"); System.out.println("car = " + car); System.out.println("engine = " + engine); } }


객체저장소에 3개의 객체가 저장되어있을 때

첫 번째 노란색 상자는 수동으로 객체 참조를 연결해주는 것

value값을 iv에 저장하는 것이다

 

이렇게 수동으로 하는 것이 아니라

어노테이션을 붙인다 -> 객체를 자동 연결해준다 

 

map에 저장된 객체들을 찾아서 자동 연결해준다.

(by Type으로 찾아서)

저장소에 저장된 객체의 value를 뒤진 다음,

찾은 값을 참조 변수에 대입 하는 것이다.


By Name으로 찾아서 자동 연결하는 방법 

 

by Name은 해당 키로 찾아서 밸류를 대입해주는 것이고

by Type은 Value로 instanceOf로 찾는 것 -> 찾아서 참조변수에 저장


<java />
@Component class Car{ Engine engine; //iv Door door; //iv }
<java />
public class Main4 { public static void main(String[] args) throws Exception { AppContext ac = new AppContext(); //객체 저장소 만들기 Car car = (Car) ac.getBean("car"); //byName으로 객체를 검색 Engine engine = (Engine) ac.getBean("engine"); Door door = (Door) ac.getBean(Door.class); //byType으로 객체를 검색 //수동으로 객체를 연결 car.engine=engine; car.door=door; System.out.println("car = " + car); System.out.println("engine = " + engine); System.out.println("door = " + door); } }

 

Car에 toString을 추가해본다.

<java />
@Component class Car{ Engine engine; //iv Door door; //iv @Override public String toString() { return "Car{" + "engine=" + engine + ", door=" + door + '}'; } }
<java />
public class Main4 { public static void main(String[] args) throws Exception { AppContext ac = new AppContext(); //객체 저장소 만들기 Car car = (Car) ac.getBean("car"); //byName으로 객체를 검색 Engine engine = (Engine) ac.getBean("engine"); Door door = (Door) ac.getBean(Door.class); //byType으로 객체를 검색 //수동으로 객체를 연결 // car.engine=engine; // car.door=door; System.out.println("car = " + car); System.out.println("engine = " + engine); System.out.println("door = " + door); } }

수동으로 객체를 연결하는 부분을 주석 처리를 하니,

Car의 iv들이 null로 나온다.

 


@Autowired를 붙이고

doAutowired 메소드를 만들었다

<java />
@Component class Car{ @Autowired Engine engine; //iv @Autowired Door door; //iv @Override public String toString() { return "Car{" + "engine=" + engine + ", door=" + door + '}'; } }

 

<java />
AppContext() { map = new HashMap(); doComponentScan(); doAutowired(); } private void doAutowired(){ //map에 저장된 객체의 iv 중에 @Autowired가 붙어있으면 //map에서 iv의 타입에 맞는 객체를 찾아서 연결(객체의 주소를 iv에 저장한다는 뜻) try { for(Object bean: map.values()){ for(Field fld:bean.getClass().getDeclaredFields()){ if(fld.getAnnotation(Autowired.class)!=null){ //by Type fld.set(bean,getBean(fld.getType())); //car에 engine이 있으면 obj를 넣어주는 것이다 } } } } catch (IllegalAccessException e) { e.printStackTrace(); } }


@Resource 실습

<java />
@Component class Car{ @Resource Engine engine; //iv @Resource Door door; //iv @Override public String toString() { return "Car{" + "engine=" + engine + ", door=" + door + '}'; } }
<java />
AppContext() { map = new HashMap(); doComponentScan(); doAutowired(); doResource(); } private void doResource() { //map에 저장된 객체의 iv 중에 @Resource가 붙어있으면 //map에서 iv의 이름에 맞는 객체를 찾아서 연결(객체의 주소를 iv에 저장한다는 뜻) try { for(Object bean: map.values()){ for(Field fld:bean.getClass().getDeclaredFields()){ if(fld.getAnnotation(Resource.class)!=null){ //by Name fld.set(bean,getBean(fld.getName())); //car에 engine이 있으면 obj를 넣어주는 것이다 } } } } catch (IllegalAccessException e) { e.printStackTrace(); } }

profile

Burninghering's Blog

@개발자 김혜린

안녕하세요! 반갑습니다.