English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Spring AOP AspectJ Xml 구성 예제

Spring은 xml 파일에서 측면, 조언, 점진을 정의할 수 있게 합니다.

이전 페이지에서 주석을 사용한 aop 예제를 보았습니다. 지금, xml 구성 파일을 통해 같은 예제를 볼 것입니다.

조언을 정의하는 xml 요소를 살펴보겠습니다.

aop: before 실제 비즈니스 로직 메서드 호출 전에 적용됩니다. aop: after 실제 비즈니스 로직 메서드 호출 후에 적용됩니다. aop: returnAfter실제 비즈니스 로직 메서드 호출 후에 적용됩니다. 알림의 반환 값을 방해할 수 있습니다. aop: around 실제 비즈니스 로직 메서드 호출 전과 후에 모두 적용됩니다. aop: throwAfter실제 비즈니스 로직 메서드가 예외를 발생시키면, 그것을 적용합니다.
주의: aop 개념 및 그 장점 등을 알아보려면 여기를 방문하세요. AOP 개념 강의

1aop: before

실제 비즈니스 로직 메서드 전에 "先行 AspectJ 조언"을 적용합니다. 여기서 어떤 작업을 수행할 수 있습니다. 예를 들어, 변환, 인증 등.

실제 비즈니스 로직을 포함한 클래스를 생성합니다.

파일: Operation.java
package com.w;3codebox;
public class Operation{
	public void msg(){System.out.println("msg method invoked");}
	public int m(){System.out.println("m method invoked");return 2;}
	public int k(){System.out.println("k method invoked");return 3;}
}

이제, 조언 이전에 포함된 측면 클래스를 생성합니다.

파일: TrackOperation.java

package com.w;3codebox;
import org.aspectj.lang.JoinPoint;
public class TrackOperation{
	public void myadvice(JoinPoint jp)//이는 advice입니다
	{
		System.out.println("추가적인 관심사");
		//System.out.println("메서드 서명: ");  + jp.getSignature());
	}
}

现在创建定义bean的applicationContext.xml文件。

파일: applicationContext.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:aop="http://www.springframework.org/schema/aop
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy />
<bean id="opBean" class="com.w3codebox.Operation">	</bean>
<bean id="trackAspect" class="com.w3codebox.TrackOperation"></bean>
<aop:config>
  <aop:aspect id="myaspect" ref="trackAspect" >
     <!-- @Before -->
     <aop:pointcut id="pointCutBefore"	expression="execution(* com.w3codebox.Operation.*(..))" />
     <aop:before method="myadvice" pointcut-ref="pointCutBefore" />
  </aop:aspect>
</aop:config>
</beans>

이제, 실제 메서드를 호출해 보겠습니다.

파일: Test.java

package com.w;3codebox;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test{
	public static void main(String[] args){
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		Operation e = (Operation) context.getBean("opBean");
		System.out.println("calling msg...");
		e.msg();
		System.out.println("calling m...");
		e.m();
		System.out.println("calling k...");
		e.k();
	}
}

출력

calling msg...
추가적인 고려사항
msg() method invoked
calling m...
추가적인 고려사항
m() method invoked
calling k...
추가적인 고려사항
k() 메서드가 호출되었습니다

보시다시피, msg(), m(), k() 메서드 호출 전에 다른 문제도 출력됩니다.


2aop: 이후 예제

실제 비즈니스 로직 메서드 호출 후, 알림 이후 AspectJ를 적용했습니다. 로그 유지, 보안, 알림 등에 사용할 수 있습니다.

여기서 우리는 Operation.java TrackOperation.java Test.java 文件与aop: 中的示例相同。

现在创建定义bean的applicationContext.xml文件。

파일: applicationContext.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:aop="http://www.springframework.org/schema/aop
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy />
<bean id="opBean" class="com.w3codebox.Operation">	</bean>
<bean id="trackAspect" class="com.w3codebox.TrackOperation"></bean>
<aop:config>
  <aop:aspect id="myaspect" ref="trackAspect" >
     <!-- @After -->
     <aop:pointcut id="pointCutAfter"	expression="execution(* com.w3codebox.Operation.*(..))" />
     <aop:after method="myadvice" pointcut-ref="pointCutAfter" />
  </aop:aspect>
</aop:config>
</beans>

출력

calling msg...
msg() method invoked
추가적인 고려사항
calling m...
m() method invoked
추가적인 고려사항
calling k...
k() 메서드가 호출되었습니다
추가적인 고려사항

您可以看到在调用msg(),m()和k()方法之后,还会出现其他问题。


3、aop: 返回后的示例

通过在返回建议后使用,我们可以在建议中获得结果。

创建

파일: Operation.java

package com.w;3codebox;
public class Operation{
	public int m(){System.out.println("m() method invoked");return 2;}
	public int k(){System.out.println("k() method invoked");return 3;}
}

创建返回建议后包含的方面类。

파일: TrackOperation.java

package com.w;3codebox;
import org.aspectj.lang.JoinPoint;
public class TrackOperation{
	public void myadvice(JoinPoint jp,Object result)//it is advice (after advice)
	{
		System.out.println("추가적인 관심사");
		System.out.println("메서드 서명: ");  + jp.getSignature());
		System.out.println("Result in advice: ")+result);
		System.out.println("end of after returning advice...");
	}
}

파일: applicationContext.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:aop="http://www.springframework.org/schema/aop
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy />
<bean id="opBean" class="com.w3codebox.Operation">	</bean>
<bean id="trackAspect" class="com.w3codebox.TrackOperation"></bean>
<aop:config>
  <aop:aspect id="myaspect" ref="trackAspect" >
     <!-- @AfterReturning -->
     <aop:pointcut id="pointCutAfterReturning"	expression="execution(* com.w3codebox.Operation.*(..))" />
     <aop:after-returning method="myadvice" returning="result" pointcut-ref="pointCutAfterReturning" />
  </aop:aspect>
</aop:config>
</beans>

파일: Test.java

지금 실제 메서드를 호출하는 Test 클래스를 생성합니다。

package com.w;3codebox;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test{
	public static void main(String[] args){
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		Operation e = (Operation) context.getBean("opBean");
		System.out.println("calling m...");
		System.out.println(e.m());
		System.out.println("calling k...");
		System.out.println(e.k());
	}
}

출력

calling m...
m() method invoked
추가적인 고려사항
메서드 서명: int com.w3codebox.Operation.m()
조언의 결과: 2
after returning 조언의 끝...
2
calling k...
k() 메서드가 호출되었습니다
추가적인 고려사항
메서드 서명: int com.w3codebox.Operation.k()
조언의 결과: 3
after returning 조언의 끝...
3

결과적으로 두 번 출력됩니다. 첫 번째는 TrackOperation 클래스에서, 두 번째는 Test 클래스에서 출력됩니다.


4aop: around

AspectJ의 주변 조언은 실제 비즈니스 로직 메서드 호출 전과 후에 적용됩니다.

클래스를 생성합니다

파일: Operation.java

package com.w;3codebox;
public class Operation{
	public void msg(){System.out.println("msg()가 호출됩니다");}
	public void display(){System.out.println("display()가 호출됩니다");}
}

围绕 조언을 포함한 측면 클래스를 생성합니다.

advice 메서드에서 전달해야 합니다 PreceedingJoinPoint 이를 통해 proceed() 메서드를 호출하여 요청() 메서드를 호출할 수 있도록 참조합니다.

파일: TrackOperation.java

package com.w;3codebox;
import org.aspectj.lang.ProceedingJoinPoint;
public class TrackOperation
{
	public Object myadvice(ProceedingJoinPoint pjp) throws Throwable 
	{
		System.out.println("실제 메서드 호출 전 추가적인 고려사항");
		Object obj=pjp.proceed();
		System.out.println("실제 메서드 호출 후 추가적인 고려사항");
		obj을 반환합니다;
	}
}

파일: applicationContext.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:aop="http://www.springframework.org/schema/aop
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy />
<bean id="opBean" class="com.w3codebox.Operation">	</bean>
<bean id="trackAspect" class="com.w3codebox.TrackOperation"></bean>
<aop:config>
  <aop:aspect id="myaspect" ref="trackAspect" >
     <!-- @Around -->
     <aop:pointcut id="pointCutAround"	expression="execution(* com.w3codebox.Operation.*(..))" />
     <aop:around method="myadvice" pointcut-ref="pointCutAround" />
  </aop:aspect>
</aop:config>
</beans>

파일: Test.java

지금 실제 메서드를 호출하는 Test 클래스를 생성합니다。

package com.w;3codebox;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test{
	public static void main(String[] args){
		ApplicationContext context = new classPathXmlApplicationContext("applicationContext.xml");
		Operation op = (Operation) context.getBean("opBean");
		op.msg();
		op.display();
	}
}

출력

실제 메서드 호출 전 추가적인 관심사
msg()가 호출됩니다
실제 메서드 호출 후 추가적인 관심사
실제 메서드 호출 전 추가적인 관심사
display()가 호출됨
실제 메서드 호출 후 추가적인 관심사

msg() 메서드 호출과 메서드 표시 전후에 다른 문제도 출력될 수 있습니다.


5、aop: after-throwing

TrackOperation 클래스에서 예외를 출력할 수 있는 후사고의 사용을 통해, AspectJ AfterThrowing advice의 예제를 보겠습니다.

비즈니스 로직을 포함한 클래스를 생성합니다.

파일: Operation.java

package com.w;3codebox;
public class Operation{
	public void validate(int age)throws Exception{
	if(age<18){
		throw new ArithmeticException("유효하지 않은 나이");
	}
	else{
		System.out.println("감사합니다 for vote");
	}
	}
}

advice throwing 후에 포함된 aspect class를 생성합니다.

여기서는 Throwable 참조를 전달해야 합니다. 이렇게 하면 예외를 이곳에서 캡처할 수 있습니다.

파일: TrackOperation.java

package com.w;3codebox;
import org.aspectj.lang.JoinPoint;
public class TrackOperation{
	public void myadvice(JoinPoint jp,Throwable error)//이는 advice입니다
	{
		System.out.println("추가적인 관심사");
		System.out.println("메서드 서명: ");  + jp.getSignature());
		System.out.println("예외는: ");+error);
		System.out.println("advice throwing 후의 끝...");
	}
}

파일: applicationContext.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:aop="http://www.springframework.org/schema/aop
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy />
<bean id="opBean" class="com.w3codebox.Operation">	</bean>
<bean id="trackAspect" class="com.w3codebox.TrackOperation"></bean>
<aop:config>
  <aop:aspect id="myaspect" ref="trackAspect" >
     <!-- @AfterThrowing -->
     <aop:pointcut id="pointCutAfterThrowing"	expression="execution(* com.w3codebox.Operation.*(..))" />
     <aop:after-throwing method="myadvice" throwing="error" pointcut-ref="pointCutAfterThrowing" />
  </aop:aspect>
</aop:config>
</beans>

파일: Test.java

지금 실제 메서드를 호출하는 Test 클래스를 생성합니다。

package com.w;3codebox;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test{
	public static void main(String[] args){
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		Operation op = (Operation) context.getBean("opBean");
		System.out.println("calling validate...");
		try{
			op.validate(19);
		}catch(Exception e){System.out.println(e);}
		System.out.println("calling validate again...");
		try{
		    op.validate(11);
		}catch(Exception e){System.out.println(e);}
	}
}

출력

validate 호출...
투표에 감사합니다
validate 다시 호출...
추가적인 고려사항
메서드 서명: void com.w3codebox.Operation.validate(int)
Exception은: java.lang.ArithmeticException: Not valid age
after throwing advice...의 끝
java.lang.ArithmeticException: Not valid age