-
서비스 로더 (service loader)사용하기TIL 2021. 2. 7. 15:37
서비스 로더
백기선님 study에서 얻은 정보
내가 interface만 알고 있는데 구현체를 알고 싶을 때 사용 가능
단 라이브러리에 있어야 한다. jar파일이 있어야 가능
실습을 해보자
- 구조는 SampleInterFace라는 프로젝트가 있고 여기에는 Hello라는 인터페이스가 있다. 메소드는 hello가 있다.
- 다른 프로젝트 SampleController에서 위의 jar파일을 라이브러리로 가지고 있고 Hello의 구현체를 정의했다. 여기에 META-INF 디렉터리와 인터페이스가 있는 경로를 이름으로 가지는 파일을 만들고 그 파일 내용은 구현체의 경로를 적는다.
- 다른 프로젝트 SampleService에서 SampleController의 jar파일 라이브러리로 갖고 서비스 로더를 통해 Hello의 구현체를 찾으면 구현체가 나온다.
1.
2.
SampleController 프로젝트에서 SampleInterFace프로젝트의 jar파일을 라이브러리로 가지고 있다.
이 프로젝트에서는 Hello의 구현체를 정의한다.
서비스 로더에 이용을 당하려면 여기서 끝이 아니라
META-INF/services 폴더를 만들고
그 아래에 Hello인터페이스의 FQNC를 이름으로 가지는 파일을 만들고
그 안에 내용으로는 구현체의 FQNC를 적어줘야 한다.
3.
이제 다른 프로젝트인 SampleService에서 SampleController의 jar파일을 라이브러리로 가지고 서비스 로더를 사용한다.
서비스 로더에 interface만 넘겨줬는데 구현체를 찾아서 하나하나 실행시킬 수가 있다.
이 서비스 로더는 스프링에서 자신만의 방식으로 쓰인다고 하는데 까먹었다..
또 롬복에서 어노테이션 프로세서를 찾을 때 사용한다. 파일을 뜯어보면 AbstractProcesser를 상속받는 어노테이션 프로세서가 있다.
컴파일타임에 @getter나 @setter등 롬복의 어노테이션을 발견하면 서비스로더를 사용해 구현체인 annotation processer를 찾아서 실행시키는 거 같다.
자바 프로젝트 jar파일 만드는 법
라이브러리 추가 법 (인텔리제이)
File -> Project Structure... -> Libraries -> '+' 누른 후 찾아서 add 하면 됨'TIL' 카테고리의 다른 글
2021.02.08 기록장 (0) 2021.02.07 Format클래스 및 잡다한 팁? (0) 2021.02.07 객체를 런타임 시점에 동적으로 생성하기 (0) 2021.02.07 리플렉션을 이용해 private 필드 값 변경 (0) 2021.02.07 2021.02.07 기록장 (0) 2021.02.06