반응형
Execution 명시자
Pointcut을 지정할 때 사용하는 문법입니다.
execution : 접근 제한자, 리턴 타입, 클래스이름, 메서드 이름(매개변수)
접근 제한자 : pulic만 지원됩니다.
리턴타입 : 메서드의 매개변수 타입
클래스 이름 : 패키지를 포함한 클래스 이름
메서드 이름 : 메서드의 이름
매개변수 : 매개변수의 형태
* : 하나의 모든 것을 의미합니다.
.. : 개수 상관없이 모든 것을 의미합니다.
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>kr.co.softcampus</groupId>
<artifactId>ExecutionDirective</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- xml에서 사용할 속성들 -->
<properties>
<!-- 자바 버전 -->
<java-version>1.8</java-version>
<!-- 스프링 버전 -->
<org.springframework-version>5.1.9.RELEASE</org.springframework-version>
<!--<org.springframework-version>4.3.25.RELEASE</org.springframework-version> -->
<org.slf4j-version>1.7.26</org.slf4j-version>
<ch.qos.logback-version>1.2.3</ch.qos.logback-version>
<javax.annotation-version>1.3.2</javax.annotation-version>
<org.aspectj-version>1.9.4</org.aspectj-version>
</properties>
<!-- 프로젝트에서 사용할 라이브러리 정보 -->
<dependencies>
<!-- spring context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<!-- logback -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${ch.qos.logback-version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>${javax.annotation-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
</dependencies>
</project>
beans.xml
<?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:context="http://www.springframework.org/schema/context"
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/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id='xml1' class='kr.co.softcampus.beans.TestBean1'/>
<bean id='xml2' class='kr.co.softcampus.beans.TestBean2'/>
<bean id='xml3' class='kr.co.softcampus.beans2.TestBean1'/>
<bean id='advisor1' class='kr.co.softcampus.advisor.AdvisorClass'/>
<aop:config>
<aop:aspect ref='advisor1'>
<!-- 반환타입이 void, kr.co.softcampus.beans.TestBean1 클래스, method1 메서드, 매개변수 없음 -->
<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.TestBean1.method1())"/> -->
<!-- 반환타입이 void, kr.co.softcampus.beans.TestBean1 클래스, method1 메서드, 정수형 매개변수 1개 -->
<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.TestBean1.method1(int))"/> -->
<!-- 반환타입이 void, kr.co.softcampus.beans.TestBean1 클래스, method1 메서드, String 타입 매개변수 1개 -->
<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.TestBean1.method1(java.lang.String))"/> -->
<!-- 반환타입이 void, kr.co.softcampus.beans.TestBean1클래스, method1 메서드, 모든 타입의 매개변수 1개 -->
<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.TestBean1.method1(*))"/> -->
<!-- 반환타입이 void, kr.co.softcampus.beans.TestBean1클래스, method1 메서드, 정수형 매개변수 2개 -->
<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.TestBean1.method1(int, int))"/> -->
<!-- 반환타입이 void, kr.co.softcampus.beans.TestBean1클래스, method1 메서드, 정수형 매개변수 1개, String 타입 매개변수 1개 -->
<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.TestBean1.method1(int, java.lang.String))"/> -->
<!-- 반환타입이 void, kr.co.softcampus.beans.TestBean1클래스, method1 메서드, 모든 타입의 매개변수 2개 -->
<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.TestBean1.method1(*, *))"/> -->
<!-- 반환타입이 void, kr.co.softcampus.beans.TestBean1클래스, method1메서드, 모든 타입의 매개변수 0개이상 -->
<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.TestBean1.method1(..))"/> -->
<!-- 반환타입이 void, kr.co.softcampus.beans.TestBean1클래스, 모든 메서드 -->
<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.TestBean1.*(..))"/> -->
<!-- 반환타입이 void, kr.co.softcampus.beans 패키지의 모든 클래스, method1 메서드 -->
<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.*.method1(..))"/> -->
<!-- 반환타입이 void, kr.co.softcampus.beans 패키지의 모든 클래스, 모든 메서드 -->
<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.*.*(..))"/> -->
<!-- 반환타입이 void, kr.co.softcampus.의 모든 패키지의 모든클래스, 모든 메서드 -->
<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.*.*.*(..))"/> -->
<!-- 반환타입이 void, 모든 패키지, 모든 클래스, 모든 메서드 -->
<!-- <aop:pointcut id="point1" expression="execution(void *.*(..))"/> -->
<!-- 반환타입이 int, 모든 패키지, 모든 클래스, 모든 메서드 -->
<!-- <aop:pointcut id="point1" expression="execution(int *.*(..))"/> -->
<!-- 모든 반환타입, 모든 패키지, 모든 클래스, 모든 메서드 -->
<!-- <aop:pointcut id="point1" expression="execution(* *.*(..))"/> -->
<aop:pointcut id="point1" expression="execution(* method1(..))"/>
<aop:before method="beforeMethod" pointcut-ref="point1"/>
</aop:aspect>
</aop:config>
</beans>
AdvisorClass.java
package kr.co.softcampus.advisor;
public class AdvisorClass {
public void beforeMethod() {
System.out.println("beforeMethod 호출");
}
}
TestBean1.java
package kr.co.softcampus.beans;
public class TestBean1 {
public void method1() {
System.out.println("beans.TestBean1.method1()");
}
public void method1(int a1) {
System.out.println("beans.TestBean1.method1(int)");
}
public void method1(String a2) {
System.out.println("beans.TestBean1.method1(java.lang.String)");
}
public void method1(int a1, int a2) {
System.out.println("beans.TestBean1.method1(int, int)");
}
public void method1(int a1, String a2) {
System.out.println("beans.TestBean1.method1(int, String)");
}
public void method2() {
System.out.println("beans.TestBean1.method2()");
}
public int method3() {
System.out.println("int beans.TestBean1.method3()");
return 100;
}
}
TestBean2.java
package kr.co.softcampus.beans;
public class TestBean2 {
public void method1() {
System.out.println("beans.TestBean2.method1()");
}
}
TestBean1.java
package kr.co.softcampus.beans2;
public class TestBean1 {
public void method1() {
System.out.println("beans2.TestBean1.method1()");
}
}
main.java
package kr.co.softcampus.main;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import kr.co.softcampus.beans.TestBean1;
import kr.co.softcampus.beans.TestBean2;
public class MainClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("kr/co/softcampus/config/beans.xml");
TestBean1 xml1 = ctx.getBean("xml1", TestBean1.class);
TestBean2 xml2 = ctx.getBean("xml2", TestBean2.class);
kr.co.softcampus.beans2.TestBean1 xml3 = ctx.getBean("xml3", kr.co.softcampus.beans2.TestBean1.class);
xml1.method1();
System.out.println("---------------------------------");
xml1.method1(100);
System.out.println("-----------------------------------");
xml1.method1("문자열");
System.out.println("----------------------------------------");
xml1.method1(100, 200);
System.out.println("-----------------------------------------");
xml1.method1(100, "문자열");
System.out.println("----------------------------------------");
xml1.method2();
System.out.println("--------------------------------------------");
xml2.method1();
System.out.println("---------------------------------------------");
xml3.method1();
System.out.println("-------------------------------------------------");
int a1 = xml1.method3();
System.out.printf("a1 : %d\n", a1);
ctx.close();
}
}
정리
포인트컷을 지정할 때 사용하는 문법에 대해 알아보았습니다. 상황에 따라, 다양한 방식으로 포인트컷 적용 여부를 선택할 수 있는 것을 알 수 있었습니다. 해당 beans.xml 파일을 주석 처리된 코드들을 따라가보면, 어떠한 방식으로 적용할 수 있는지 알 수 있습니다.
특정 메소드에 대해 관점적으로 분리해, 에러가 난 경우, 에러가 나지 않은 경우에 대해 실행될 메소드를 적용할 수 있고, 이러한 기능들을 토대로 웹 개발자들은 로직에 좀 더 집중할 수 있겠구나라는 생각이 들었습니다.
구체적인 내용과 정보들은 아래 강좌에서 확인하실 수 있습니다. 쉽게 친절히 강의를 진행해주셔서, 개인적으로 강사님의 강좌를 여러가지를 들으면서 공부하고 있습니다.
반응형
'SW > Java' 카테고리의 다른 글
Java : Spring : JDBC : 개념, 사용, 방법, 예제, 구현 (0) | 2020.06.15 |
---|---|
Java : Spring :AspectJ 어노테이션 : 개념, 사용, 방법, 예제, 구현 (0) | 2020.06.14 |
Java : Spring : AOP 기본 개념, 용어, 구현, 예제 (0) | 2020.06.12 |
Java : Spring : 자동 주입 : 예제, 구현 (0) | 2020.06.11 |
Java : Spring : bean 컬렉션 주입 : 개념, 예제, 구현 (0) | 2020.06.10 |