AOP
14285 ワード
@Transactional
public class MemberService {
private final MemberRepository memberRepository;
//Dependency Injection
//현 클래스에서 생성하는 것이 아닌 외부에서 생성한 것을 넣어주는 형태
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
/**
* 회원 가입
*/
public Long join(Member member){
long start = System.currentTimeMillis();
try{
//같은 이름이 있는 중복회원은 안된다는 조건 추가
validateDuplicateMember(member);
memberRepository.save(member);
return member.getId();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("join =" + timeMs+"ms");
}
}
private void validateDuplicateMember(Member member) {
memberRepository.findByName(member.getName())
.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다");
});
}
/**
* 전체 회원 조회
*/
public List<Member> findMembers() {
long start = System.currentTimeMillis();
try {
return memberRepository.findAll();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("findMembers ="+timeMs+"ms");
}
}
public Optional<Member> findOne(Long memberId){
return memberRepository.findById(memberId);
}
}
join法とfindMembers法では時間測定のためのコードを追加した.このサービスクラスに数十、数百の方法がある場合、メンテナンスとメンテナンスはどうなりますか?非常に難しい
に質問
測定
このためにAOPを適用する
After
問題を共通の関心事項と核心的な関心事項に分ける
Cross-cutting-concern VS Core-concern
適用
AOPのTimeTraceAOPクラスの作成
@Aspect
@Component
public class TimeTraceAop {
@Around("execution(* hello.hellospring..*(..))") //hello.hellospring 하위 모든 파일에 적용하겠다는 의미
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
System.out.println("START :"+joinPoint.toString());
try {
return joinPoint.proceed();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("END :"+joinPoint.toString()+", "+timeMs+"ms");
}
}
}
結果
測定
選択可能
スプリングのAOP運動方式
既存のスプリング依存関係からクラスを呼び出す
ハローコントローラ----->メンバーサービス依存
helloControllerがmemberServiceメソッドを呼び出すとmemberServiceによって呼び出されます
AOP適用後依存関係からクラスを呼び出す
AOPがある場合、スプリングは呼び出されたメンバーサービスの偽エージェントを作成します.では、エージェント(偽)が呼び出され、終了すると、
joinPoint.preceed()
が呼び出され、実際のメンバサービスが呼び出される.Reference
この問題について(AOP), 我々は、より多くの情報をここで見つけました https://velog.io/@dnstlr2933/AOP-m8rf06kyテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol