You will be fine

<Spring> 8. AOP

by BFine
반응형

1. AOP

  • OOP ( Object Oriented Programming ), AOP( Aspect[관심] Oriented Programming)

  • java는 OOP로 핵심로직(종단관심), 공통로직(횡단관심)으로 구성되어있다.

  • AOP는 관점 지향 프로그래밍으로  OOP에서 공통로직( 횡단관심 )을 분리하여 구성--> 모듈성 증가

  • Maven : spring 라이브러리를 자동으로 처리, aspectj weaver 필요( Dependency 추가 ) & namespace

    https://mvnrepository.com/artifact/org.aspectj/aspectjweaver

  • aop:pointcut 공통로직을 연결할 대상 찾기, execution =() --> id

  • 접근지시자(생략하면 모든) return-type package.class.method(parameters) , *모든 . 현재 .. 하위

  • parameters (..) -> 어떤것이든 상관없다.(0개이상, 없으면 매개변수 없는 것)

  • ※ 일반 객체 생성시 적용안됨

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<bean id="be2" class="aop.Aop" />
 
<aop:config>
 <aop:pointcut expression="execution(public * aop.*.*(..))" id="pc"/>
 <aop:aspect ref="be">
 <aop:before method="before" pointcut-ref="pc"/>
 </aop:aspect>
</aop:config>
======================================================
Aop aop=aContext.getBean("be2",Aop.class);
Aop aop2=new Aop();
aop.progress();
aop2.progress(); //적용안됨
=====================================================
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<aop:config>
 //aop 구성
 <aop:pointcut expression="execution(public * aop.*.*(..))" id="pc"/>
//execution(접근지시자 리턴값 패키지명+메소드명(파리미터s)  )
 <aop:aspect ref="be">
 <aop:before method="aop메소드" pointcut-ref="pc"/>
<aop:after method="" pointcut-ref=""/>
//실행하기 전후
 <aop:around method="" pointcut-ref=""/>
//before+after
 <aop:after-returning method="" pointcut-ref="" />
// return 값을 받거나 잘 실행될 경우
 <aop:after-throwing method="" pointcut-ref=""/>
// 예외 전달
 </aop:aspect>
</aop:config>
 
cs
  • <예제>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void around(ProceedingJoinPoint joinPoint) {
        try {
            System.out.println("AROUND처음실행");
            joinPoint.proceed(); // proceed 기준으로 위에 before,
                                                       // 아래는 after
            System.out.println("AROUND나중실행");
        } catch (Throwable e) {            // TODO Auto-generated catch block
            e.printStackTrace();
        }        
    }
 
public void before() {
        System.out.println("BEFORE실행");
    }
public void affter() {
        System.out.println("AFTER실행");
    }
==============Main=================
test.display_ba("Hello");//매개변수 출력
System.out.println();
test.display_ar("Hello","world");
cs

1
2
3
4
5
6
7
8
9
10
<bean id="test" class="aop.Test"></bean>
 
<aop:config>
 <aop:pointcut expression="execution(public * aop.Test.display_ba(..))" id="pc"/>
 <aop:aspect ref="be">
 <aop:before method="before" pointcut-ref="pc"/>
 <aop:after method="affter" pointcut-ref="pc"/>
 <aop:around method="around" pointcut="execution(public * aop.Test.display_ar(..))"/>
 </aop:aspect>
</aop:config>
cs



실행



2. Annotation aop

  • Annotation만으로도 aop를 설정 가능하다. , XML-> Namespaces -> context 체크

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
===============XML===================
<context:component-scan base-package="test"/>
// Component 들을 찾아서 매핑
<aop:aspectj-autoproxy/>
//자동으로 Annotaion aop를 매핑
================Aop.java================
@Component
@Aspect
//Aop 어노테이션 자동으로 설정 
public class Aop {    
@Pointcut("execution(public void test.*.*(..))")
  public void point() {}//중복되는 것 하나로 설정    
@Before("point()")
  public void before() {
        System.out.println("BEFORE실행");}
@After("point()")
  public void after() {
        System.out.println("AFTER실행");}
//리턴값을 받아서 처리하기 때문에 returnning설정 필수    
@AfterReturning(pointcut="execution(public int test.*.*())",
returning="returnValue" )
    public void afterReturn(int returnValue) {
        System.out.println("30마리 가격 : "+ returnValue*30);}
}
==================Main.java==========================
ApplicationContext aContext=
    new ClassPathXmlApplicationContext("aopt.xml");
      Dog beagle=aContext.getBean("dog",Dog.class);
     Dog mala=aContext.getBean("dog2",Dog.class);
          
    beagle.bark();
        System.out.println();
    mala.bark();
        System.out.println();        
    beagle.avg_price();
        System.out.println();
    mala.avg_price();
=====================================================    
cs


실행



반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기