핵심기능이 실행 되기 전에 공통기능이 실행되고 핵심기능이 끝나면 또 공통기능이 실행된다.
// 메인 클래스
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 |