AspectJ도 Instrumentation API를 사용한다...
Instrumentation API 주요 기능
- ClassFileTransformer:
- ClassFileTransformer는 클래스가 로드되기 전에 바이트코드를 변환할 수 있는 인터페이스입니다. 이를 통해 클래스 파일을 로드하거나 정의하는 과정에서 코드를 삽입하거나 수정할 수 있습니다.
- 예를 들어, 메소드 호출 전후에 로그를 기록하는 기능을 추가하거나, 메소드 실행 시간을 측정하는 코드를 삽입할 수 있습니다.
- Java Agent:
- Instrumentation API를 사용하는 주요 방법 중 하나는 Java 에이전트를 사용하는 것입니다. 에이전트는 JVM이 시작될 때 클래스 로더에 ClassFileTransformer를 등록하여, 모든 클래스가 로드되기 전에 바이트코드를 변경할 수 있습니다.
- 에이전트는 JVM 시작 시에 -javaagent 옵션을 통해 지정되며, 런타임에 클래스를 조작하는 데 사용됩니다.
- Retransformation:
- Instrumentation API는 이미 로드된 클래스를 다시 변환(retransform)할 수 있는 기능도 제공합니다. 이 기능은 클래스가 이미 JVM에 의해 로드된 후에도 바이트코드를 수정할 수 있게 합니다.
- Redefinition:
- RedefineClasses 메소드를 사용하여, JVM에서 실행 중인 클래스의 정의를 새롭게 바꿀 수 있습니다. 이 기능을 사용하면 기존 클래스의 메소드나 필드의 바이트코드를 새롭게 정의할 수 있습니다.
프로파일링 및 성능 모니터링을 할 때 중요하다!!(많이씀)
premain을 구현해야 instrumentation api를 사용 할 수 있다.
ClassFIleTransforemer를 구현해야 바이트코드 조작을 할 수 가 있다.
ASM : CGRIB에서 바이트코드 조작을 할 때 쓰인다.
instrumentation api 자체로는 바이트코드 조작을 사용 할 수 없다. 그래서 ASM이 필요하다.
Java Agent
- java -javaagent:/path/to/agent.jar -jar myapp.jar
- 이 옵션은 JVM이 시작될 때 지정된 JAR 파일을 Java Agent로 인식하고, 해당 에이전트의 premain 메서드를 호출합니다.
jar파일 디렉토리안에 메타인포데이터가 없어도 된다. com.example.preamin 이런거 <
jar파일을 만들어야 한다.
AspectJ가 Java Agent에 포함되어 있기 때문에 instrumentation api를 사용하는것이다.
클래스로드타임(런타임) : 런타임때 크로스커팅컨선에 집어 넣는것을 위빙이라고함.
Load Time Weaving : 프록시를 생성하지 않고 바로 바이트코드에 때려박는다.
Java Agent는 premain과 연관이 깊다.
appilcation based configuration metadata
우리의 비지니스 로직에 타겟이 되는 애들을 Domain이라고 한다.
@Configurable : Spring IoC에 의해 관리되는 빈이 아님!!!
-> 이 어노테이션만을 가지고는 아무런 동작을 하지않는다.
-> 이 어노테이션만 써서는 Spring IoC에 의해 관리가 안된다!!!
-> 이 어노테이션을 쓰고 Java Agent를 명시하고 하면은 주입이 된다.
만약에
@Autowired
MyService myService; // MyService는 SpringIoC에 의해 관리되는 빈임.
Streo Type은 Spring IoC에 의해 관리가 된다. // @Component, @Service, @Repository, @Controller
'Note-Taking' 카테고리의 다른 글
Autowired 어노테이션 사용 방법 정리 (0) | 2024.09.03 |
---|---|
Annotation-based Container Configuration과 Java-based Container Configuration 정리 (0) | 2024.09.03 |
Spring Framework에서 테스트 어노테이션과 자바 기반 설정의 역할 정리 (0) | 2024.08.09 |
Java 클래스 구조 정리 (0) | 2024.08.07 |
Dependency Injection,CGLIB 정리 (0) | 2024.08.06 |