AOP 구현 방식 중 @Aspect 어노테이션을 기반으로 한 예제이다.


1. LogAop.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.java.ex3;
 
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
 
@Aspect
public class LogAop {
    
    @Pointcut("bean(*ker)")        //~ker로 끝나는 빈에만 적용
    private void pointcutMethod() {
    }
    
    @Around("pointcutMethod()")
    public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable {
        String signatureStr = joinpoint.getSignature().toShortString();
        System.out.println(signatureStr + "is start.");
        long st = System.currentTimeMillis();
        
        try {
            Object obj = joinpoint.proceed();
            return obj;
        } finally {
            long et = System.currentTimeMillis();
            System.out.println(signatureStr + " is finished.");
            System.out.println(signatureStr + " 경과시간 : " + (et - st));
        }
    }
    
    @Before("within(com.java.ex3.*)")
    public void beforeAdvice() {
        System.out.println("beforeAdvice()");
    }
}
cs


2. MainClass.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.java.ex3;
 
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
 
public class MainClass {
    public static void main(String[] args) {
        
        AbstractApplicationContext ctx
        = new GenericXmlApplicationContext("classpath:applicationCTX3.xml");
        
        Student student = ctx.getBean("student", Student.class);
        student.getStudentInfo();
        
        Worker worker = ctx.getBean("worker", Worker.class);
        worker.getWorkerInfo();
        
        ctx.close();
    }
}
cs


3. Student.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.java.ex3;
 
public class Student {
    private String name;
    private int age;
    private int gradeNum;
    private int classNum;
    
    public void getStudentInfo() {
        System.out.println("이름 : " + getName());
        System.out.println("나이 : " + getAge());
        System.out.println("학년 : " + getGradeNum());
        System.out.println("반 : " + getClassNum());
    }
 
    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;
    }
}
cs


4. Worker.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.java.ex3;
 
public class Worker {
    private String name;
    private int age;
    private String job;
    
    public void getWorkerInfo() {
        System.out.println("이름 : " + getName());
        System.out.println("나이 : " + getAge());
        System.out.println("직업 : " + getJob());
    }
 
    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;
    }
}
cs


5. applicationCTX3.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
 
    <aop:aspectj-autoproxy />
    <bean id="logAop" class="com.java.ex3.LogAop" />
    
    <bean id="student" class="com.java.ex3.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.java.ex3.Worker">
        <property name="name" value="홍길순" />
        <property name="age" value="35" />
        <property name="job" value="개발자" />
    </bean>
    
</beans>
cs


*실행결과

=> 앞에 작성했던 XML 스키마 기반과 달리 @Aspect 어노테이션을 사용하여 AOP를 구현 하였다.
또 pointcut을 지정하기 위해 표현식으로 Aspectj 문법을 사용하였다.

 @Pointcut("bean(*ker)")        //~ker로 끝나는 빈에만 적용
    private void pointcutMethod() {
    }

ker로 끝나는 빈에만 적용을 지정하였기 떄문에 실행결과에서 Student 는 공통 기능(LogAop)이
적용되지 않았고 Worker 에만 적용이 된 모습을 확인할 수 있다.


'Spring' 카테고리의 다른 글

SpringMVC 게시판  (0) 2016.05.18
SpringMVC(get, post 방식으로 값 넘기기)  (0) 2016.05.17
SpringMVC  (0) 2016.05.17
AOP 구현(XML 스키마 기반 Advice 종류 예제)  (0) 2016.05.13
AOP 구현(XML 스키마 기반)  (0) 2016.05.13
,