1. class에서 곧바로 newInstance() 부르는것 -> deprecated되었음
이제부터는 clazz.getDeclaredConstuctor.newInstance()로 부를것.
*) getDeclaredConstuctor와 getConstuctor의 차이: getDeclaredConstuctor는 생성자의 접근제한자레벨에 관련없이 만들어낼수있다. public이 아니어도!!! ( 그래서.. 싱글톤패턴의 허점이 여기에 있는것이다... 모 그렇게까지해서 싱글톤객체를 파내려는 시도가 있을지는 모르겠지만. 이론상으론 가능하다는 것!)
2. 대략의 프로세스는 이러하다
1) DispatcherServlet 이 init될때, command.properties안의 내용을 읽는다. 이안에는 유저요청 uri(key), 클래스경로(value)로 map형식으로 저장되어있다.
읽은 내용을 바탕으로, value의 class를 리플렉션 써서 가져온다. 가져온 Object를 새로운 Map 에 uri(key), object(value)로 해서 넣는다.
2) 실제로 유저에게서 uri요청이 들어오면 -> map 의 key와 대조해서 찾고, object의 메소드 불러서 viewname을 가져온다. 가져온 viewname을 RequestDispatcher가 포워딩해서 처리한다.
3. 포인트
interface를 이용한 다형성 : 모든 controller는 view를 처리하는 슈퍼클래스를 상속받는다. 그렇게함으로써- 이 메소드만 부르면 viewname을 얻을수있도록. ( 타입변환필요) 그냥 Object클래스로 받으면.. Object에게는 당연히 해당 메소드가 없기 때문에.. 타입 변환을 해서 interface의 메소드를 사용할수있도록 해준다.
댓글 없음:
댓글 쓰기