※ AOP를 사용하기 위해서는 인터페이스가 있어야함
📃Aop.java
※ xyz.itwill06.oop 패키지에 Aop.java 인터페이스 생성
package xyz.itwill06.oop; // public interface Aop { void display1(); void display2(); void display3(); }
📢핵심관심모듈 : 핵심관심코드만 이용하여 메소드를 작성한 클래스
📃AopOne.java
※ xyz.itwill06.oop 패키지에 AopOne.java 클래스 생성
package xyz.itwill06.oop; // //핵심관심모듈 : 핵심관심코드만 이용하여 메소드를 작성한 클래스 public class AopOne implements Aop { // @Override public void display1() { System.out.println("### AopOne 클래스의 display1() 메소드 호출 ###"); } @Override public void display2() { System.out.println("### AopOne 클래스의 display2() 메소드 호출 ###"); } @Override public void display3() { System.out.println("### AopOne 클래스의 display2() 메소드 호출 ###"); } }
📃AopTwo.java
※ xyz.itwill06.oop 패키지에 AopTwo.java 클래스 생성
package xyz.itwill06.oop; // public class AopTwo implements Aop { // @Override public void display1() { System.out.println("### AopTwo 클래스의 display1() 메소드 호출 ###"); } @Override public void display2() { System.out.println("### AopTwo 클래스의 display2() 메소드 호출 ###"); } @Override public void display3() { System.out.println("### AopTwo 클래스의 display2() 메소드 호출 ###"); } }
📃AopApp.java
※ xyz.itwill06.oop 패키지에 AopTwo.java 클래스 생성
package xyz.itwill06.oop; // public class AopApp { public static void main(String[] args) { AopProxy one=new AopProxy(new AopOne()); AopProxy two=new AopProxy(new AopTwo()); // one.display1(); one.display2(); one.display3(); // two.display1(); two.display2(); two.display3(); } }
📢횡단관심모듈 : 횡단관심코드만 이용하여 메소드를 작성한 클래스 - Advice 코드
📃AopLogger.java
※ xyz.itwill06.oop 패키지에 AopLogger.java 클래스 생성
package xyz.itwill06.oop; // //횡단관심모듈 : 횡단관심코드만 이용하여 메소드를 작성한 클래스 - Advice 코드 public class AopLogger { public void beforeLog() { System.out.println("*** 메소드의 명령(핵심관심코드)이 실행되기 전에 기록될 내용"); } }
📢Proxy 클래스 : 핵심관심모듈의 메소드에 횡단관심모듈의 메소드를 삽입하여 동작하는 기능을 제공하는 클래스 - Aspect
※ Java Spring에서는 Proxy 클래스를 AspectJ로 자동으로 만들어줌 [Spring 7-3] 참고
📃AopProxy.java
※ xyz.itwill06.oop 패키지에 AopProxy.java 클래스 생성
package xyz.itwill06.oop; // //Proxy 클래스 : 핵심관심모듈의 메소드에 횡단관심모듈의 메소드를 삽입하여 동작하는 기능을 제공하는 클래스 - Aspect public class AopProxy implements Aop { //핵심관심모듈로 선언된 클래스의 객체를 저장하기 위한 필드 생성 //→ 필드의 자료형을 인터페이스로 선언하여 모든 자식 클래스의 객체 저장 private Aop target;//인터페이스를 상속(AopOne,AopTwo는 자식클래스) // //횡단관심모듈로 선언된 클래스의 객체를 저장하기 위한 필드 생성 private AopLogger logger; // //필드에 객체를 생성하여 저장하거나 매개변수로 객체를 전달받아 저장 - 의존성 주입(DI) //생성자 생성(target만) public AopProxy(Aop target) { super(); this.target = target; logger=new AopLogger();//logger은 만들어서 저장 } //인터페이스에 추상메소드(PointCut)를 오버라이드 선언하여 핵심관심코드와 횡단관심코드를 결합하여 실행되도록 작성 - Weaving //→ 핵심관심모듈의 메소드 호출 전 또는 후에 횡단관심모듈의 메소를 호출하여 실행되도록 설정 - JoinPoint @Override public void display1() { logger.beforeLog(); target.display1(); } @Override public void display2() { logger.beforeLog(); target.display2(); } @Override public void display3() { logger.beforeLog(); target.display3(); } }