Spring(스프링), Spring Boot(스프링부트), JSP

스프링(spring) AOP 구현하기[2] : @Aspect 어노테이션으로 구현

알통몬_ 2018. 1. 5. 12:30
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


이번 포스팅에서는 aop를 @Aspect 어노테이션으로 구현하는 방법에 대해 공부합니다.

aop의 경우 클래스에 설정하는게 xml에 설정하는 것보다 편할 수 있습니다.

xml 설정방법 보러가기▼

2018/01/05 - [Spring(스프링)] - 스프링(spring) AOP란? spring AOP 구현하기[1] : xml 스키마로 구현


1. pom.xml 파일에 의존설정부터 해주시고요.

1
2
3
4
5
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.7.4</version>
</dependency>
cs

2.공통 기능을 가지는 @Aspect 어노테이션을 가지는 클래스를 만듭니다.

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
48
49
50
51
52
53
package org.mon.altong.aop2;
 
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
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 // Aspect 역할을 한다고 명시
public class PublicAop {
 
    
    //pointcut 어노테이션이 적용된 메소드가 하나 있어야함.
    //() 안에는 어느 범위까지 적용할 지 범주를 선언
    // xml에서 선언했던 expression="" 과 같은 역할
    // <aop:pointcut id="publicLogger" expression="within(org.mon.altong.aop.*)"/>
    @Pointcut("within(org.mon.altong.aop2.*)")
    private void pointcutMethod() {}
    
    //<aop:around pointcut-ref="publicLogger" method="aopLogger"/>
    //와 같음.
    @Around("pointcutMethod()")
    public Object aopLogger(ProceedingJoinPoint jointPoint) throws Throwable {
        String signatureStr = jointPoint.getSignature().toShortString();
        System.out.println(signatureStr + " is start");
        long st = System.currentTimeMillis();
        
        try {
            Object object = jointPoint.proceed();
            return object;
        } finally {
            long et = System.currentTimeMillis();
            System.out.println(signatureStr + " is finished");
            System.out.println(signatureStr + " 경과 시간 : " + (et-st));
        }
    }
    
    
    // @Before 와 @After 는 @Pointcut 어노테이션 없이 사용.
    // 선언 시 핵심 기능이 실행되기 전에 실행됨.
    @Before("within(org.mon.altong.aop2.*)")
    public void beforeAdvice() {
        System.out.println("beforeAdvice()");
    }
    
    @After ("within(org.mon.altong.aop2.*)")
    public void afterAdvice() {
        System.out.println("afterAdvice()");
    }
    
}
 
cs

@Before와 @After의 경우 @Pointcut, @Around 를 사용하지 않아도 

핵심 기능이 실행되기 전과 후에 호출됩니다.

타이핑 해보시고 예제 실행해보시면 이해되실 거에요.


3. 스프링 설정.xml 파일에 aop 클래스 선언

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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-4.3.xsd">
 
    <aop:aspectj-autoproxy />
    <bean id="publicAop" class="org.mon.altong.aop2.PublicAop" />
 
    
    <bean id="worker" class="org.mon.altong.aop2.Worker">
        <property name="name" value="근육몬" />
        <property name="age" value="27" />
        <property name="job" value="Dev" />
    </bean>    
 
</beans>
 
cs

4. 핵심 기능을 가지는 클래스 만들기

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
package org.mon.altong.aop2;
 
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 getWorkerInfo() {
        System.out.println(getName());
        System.out.println(getAge());
        System.out.println(getJob());
    }
    
}
 
cs


5. 실행 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package org.mon.altong.aop2;
 
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
 
public class Running {
 
    public static void main(String[] args) {
        
        String loc = "classpath:aop2Context.xml";
        
        AbstractApplicationContext ctx = new GenericXmlApplicationContext(loc);
        Worker worker = ctx.getBean("worker", Worker.class);
        worker.getWorkerInfo();
        ctx.close();
    }
}
  
cs


이상입니다.

감사합니다.


반응형