자바기초

aop예제

lby132 2021. 10. 7. 22:50

핵심기능이 실행 되기 전에 공통기능이 실행되고 핵심기능이 끝나면 또 공통기능이 실행된다.

 

// 메인 클래스

public class MainClass {

 

public static void main(String[] args) {

 

AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationCTX.xml");

 

Student student = ctx.getBean("student", Student.class);

student.getStudentInfo();

 

Worker worker = ctx.getBean("worker", Worker.class);

worker.getWorkInfo();

 

ctx.close();

}

}

 

// 빈 등록 파일

<bean id="logAop" class="com.example.ex1.LogAop"/> <!-- bean 등록 -->

 

<aop:config> <!-- aop 설정 -->

<aop:aspect id="logger" ref="logAop"> <!-- aspect를 만들어 주는데  logAop를 참조하고 있다.-->

<aop:pointcut expression="within(com.example.ex1.*)" id="publicM"/> <!-- 핵심코드는 publicM이라고 한다.  com.example.ex1패키지에 있는 모든 메소드에 적용하겠다.-->

<aop:around pointcut-ref="publicM" method="loggerAop"/> <!-- aspect에 어떤 기능을 줄건지 알리는 태그(around).  publicM이라는 포인트컷에 메소드 loggerAop라는 기능을 주겠다. -->

</aop:aspect>

</aop:config>

 

<bean id="student" class="com.example.ex1.Student">

<property name="name" value="홍길동"/>

<property name="age" value="10"/>

<property name="gradeNum" value="3"/>

<property name="classNum" value="5"/>

</bean>

 

<bean id="worker" class="com.example.ex1.Worker">

<property name="name" value="홍길동"/>

<property name="age" value="35"/>

<property name="job" value="개발자"/>

</bean>

 

// student 클래스 

public class Student {

 

private String name;

private int age;

private int gradeNum;

private int classNum;

 

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public int getGradeNum() {

return gradeNum;

}

public void setGradeNum(int gradeNum) {

this.gradeNum = gradeNum;

}

public int getClassNum() {

return classNum;

}

public void setClassNum(int classNum) {

this.classNum = classNum;

}

 

// 핵심코드

public void getStudentInfo() {

System.out.println("이름 : " + getName());

System.out.println("나이 : " + getAge());

System.out.println("학년 : " + getGradeNum());

System.out.println("반 : " + getClassNum());

}

 

// worker 클래스

public class Worker {

 

private String name;

private int age;

private String job;

 

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getJob() {

return job;

}

public void setJob(String job) {

this.job = job;

}

 

// 핵심코드

public void getWorkInfo() {

System.out.println("이름 : " + getName());

System.out.println("나이 : " + getAge());

System.out.println("직업 : " + getJob());

}

}

 

// 빈으로 등록하고 공통기능이 될 LogAop 클래스

public class LogAop {

 

public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable {

String signatureStr = joinpoint.getSignature().toString();  // 핵심기능이 시작되기 전에 실행된다.

System.out.println(signatureStr + "is start.");

long st = System.currentTimeMillis();

 

try {

Object obj = joinpoint.proceed();  // aop가 적용된 메소드를 실행시킨다. 즉 핵심기능을 실행시킨다.

// joinPoint.proceed()기점으로 이전은 before, 이후는 after이다.

return obj;

}finally {

long et = System.currentTimeMillis(); // 핵심코드가 종료되면 공통코드가 한번더 실행된다.

System.out.println(signatureStr + "is finished");

System.out.println(signatureStr + "경과 시간 : " + (et - st));

}

}

}

 

 

* joinPoint.proceed() : Aop가 적용된 메소드를 전체 수행하고 리턴되는 데이터를 받는 메소드

'자바기초' 카테고리의 다른 글

HashMap과 ConcurrentHashMap의 차이점  (0) 2021.10.11
마이바티스 $와 #의 차이  (0) 2021.10.10
AOP  (0) 2021.10.06
Profile 속성  (0) 2021.10.06
Environment 객체  (0) 2021.10.06