<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 |
실행
반응형
'공부(2018~2019) - 스킨변경전 > Spring' 카테고리의 다른 글
<Spring> 10. internationalization, Spring JSON (1) | 2018.05.15 |
---|---|
<Spring> 9. MVC pattern (0) | 2018.05.09 |
<Spring> 7. Annotation (0) | 2018.05.03 |
<Spring> 6. Spring basic, IoC, DI (0) | 2018.04.30 |
<Spring> 5. Bitnami 설치-컴퓨터로 웹서버 구현 (0) | 2018.04.22 |
블로그의 정보
57개월 BackEnd
BFine