Spring DI -1

이규훈·2022년 11월 11일
0

스프링 정리

목록 보기
16/30

1. 변경에 유리한 코드

다형성을 이용해서 변경포인트를 줄인다. -> 조상를 이용
여기서 더 변경포인트를 줄이고 싶으면 따로 메서드를 생성한다. 이러면 같은 코드이지만 메서드쪽에서 수정하여도 기능을 사용하는 쪽에서는 변경을 할 필요가 없기때문이다.

2. Map과 외부 파일

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());
        }
    }

자동 객체 등록하기 - Component Scanning

class 앞에 @Component를 입력하면 클래스 읽는 방식을 com.ch3처럼 고치면 그 클래스 중에 @Component를 붙는 것들을 자동으로 등록해준다.

//패키지 내의 모든 클래스를 읽어서 Set에 저장
Set<ClassPath.ClassInfo>set = classPath.getTopLevelClasses("com.ch3");

guava라는 라이브러리를 이용한다.
대략적으로 요약하면 이렇다.

  1. 패키지 내의 모든 클래스를 읽어서 Set에 저장
  2. 패캐진 내에 @Component붙은 클래스 찾기
  3. 객체 생성해서 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();
        }
    }
profile
개발취준생

0개의 댓글

관련 채용 정보