다형성을 이용해서 변경포인트를 줄인다. -> 조상를 이용
여기서 더 변경포인트를 줄이고 싶으면 따로 메서드를 생성한다. 이러면 같은 코드이지만 메서드쪽에서 수정하여도 기능을 사용하는 쪽에서는 변경을 할 필요가 없기때문이다.
txt로저장해서 불러오면 이렇게 되면 저장하고것도 쉽고 읽기도 쉽다.
Properties p = new Properties();
p.load(new FileReader("config.txt"));
confg.txt
car = com.ch3.SportsCar
OOP를 사용해야한다.
분리가 핵심!
1. 변하는것 변하지않는것
2. 관신사
3. 중복코드 AOP
객체 저장소이다.
Class안에 객체저장소를 만든다.
HashMap 사용한다.
static Car getCar() throws Exception {
Properties p = new Properties();
p.load(new FileReader("config.txt"));
map = new HashMap(p);d
for(Object key: map.keySet()){
Class clazz = Class.forName((String)map.get(key));
map.put(key,clazz.newInstance());
}
}
class 앞에 @Component
를 입력하면 클래스 읽는 방식을 com.ch3
처럼 고치면 그 클래스 중에 @Component
를 붙는 것들을 자동으로 등록해준다.
//패키지 내의 모든 클래스를 읽어서 Set에 저장
Set<ClassPath.ClassInfo>set = classPath.getTopLevelClasses("com.ch3");
guava라는 라이브러리를 이용한다.
대략적으로 요약하면 이렇다.
- 패키지 내의 모든 클래스를 읽어서 Set에 저장
- 패캐진 내에
@Component
붙은 클래스 찾기- 객체 생성해서 map에 저장
첫글자가 소문자로 바뀐다. Car -> car
실습할시 pom.xml에 guava를 추가해야하는데 이럴려면 구글에 maven repository를 검색하고 들어가서
맨 위에 것을 들어가고
31.1-jre 클릭 후
복붙하고 pom파일에 붙여넣기 하면된다.
그리고 pom.xml 누르고 Reload project를 해야한다.
이렇게 붉은 글자 안나오면 성공이다.
예시
AppContext() {
map = new HashMap();//저장소 map 만금
doComponentScan();
// 스캔
}
public void doComponentScan(){
// 패키지내의 클래스 목록을 가져온다.
try {
//2. 반복문으로 클래스를 하나씩 읽어와서 @Component가 붙어있는지 확인
// 붙어있으면 객체를 생성해서 map에 저장
ClassLoader classLoader = AppContext.class.getClassLoader();
ClassPath classPath = ClassPath.from(classLoader);
Set<ClassPath.ClassInfo> set = classPath.getTopLevelClasses("com.ch3.dicopy3");
//Set을 반환
for(ClassPath.ClassInfo classInfo : set){
Class clazz = classInfo.load();
Component component= (Component)clazz.getAnnotation(Comparable.class)
if(component != null){
String id = StringUtils.uncapitalize( classInfo.getSimpleName());
map.put(id, clazz.newInstance());//map에 저장
}
}
} catch (Exception e) {
e.printStackTrace();
}
}