
객체 찾기
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();
}
}

'패캠 챌린지' 카테고리의 다른 글
스프링 DI 활용하기 - 이론 (0) | 2023.03.23 |
---|---|
스프링 DI 활용하기 - 실습 (0) | 2023.03.22 |
패스트캠퍼스 챌린지 - 30일차 [스프링의 정석:남궁성과 끝까지 간다] (0) | 2023.03.21 |
패스트캠퍼스 챌린지 - 29일차 [스프링의 정석:남궁성과 끝까지 간다] (0) | 2023.03.20 |
패스트캠퍼스 챌린지 - 28일차 [스프링의 정석:남궁성과 끝까지 간다] (0) | 2023.03.19 |