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

Пример конфигурации AspectJ Xml для Spring AOP

Spring позволяет вам определять аспекты, советы и точки входа в xml файле.

На предыдущей странице мы видели пример aop с использованием комментариев. Теперь мы увидим этот же пример через xml файл конфигурации.

Давайте посмотрим на xml элементы, используемые для определения аспектов.

aop: before Применяется до вызова фактического бизнес-логического метода. aop: after Применяется после вызова фактического бизнес-логического метода. aop: after returningПрименяется после вызова фактического бизнес-логического метода. Может использоваться для перехвата возвращаемого значения уведомления. aop: around Применяется до и после вызова фактического бизнес-логического метода. aop: after throwingПримените его, если фактический бизнес-логический метод выбрасывает исключение.
Внимание: Чтобы узнать о концепции aop и его преимуществах, пожалуйста, посетите здесь. Учебник по концепции aop

1. aop: before

Примените "ранний аспект AspectJ" перед фактической бизнес-логикой. Вы можете выполнить здесь любые действия, такие как преобразование, аутентификация и т.д.

Создайте класс, содержащий фактическую бизнес-логику.

файл: Operation.java
package com.w3codebox;
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.w3codebox;
import org.aspectj.lang.JoinPoint;
public class TrackOperation{
	public void myadvice(JoinPoint jp)//it is advice
	{
		System.out.println("дополнительная проблема");
		//System.out.println("Method Signature: " + jp.getSignature());
	}
}

Теперь создайте файл 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.w3codebox;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test{
	public static void main(String[] args){
		ApplicationContext контекст = new ClassPathXmlApplicationContext("applicationContext.xml");
		Operation e = (Operation) context.getBean("opBean");
		System.out.println("вызов msg...");
		e.msg();
		System.out.println("Вызов m...");
		e.m();
		System.out.println("Вызов k...");
		e.k();
	}
}

Вывод

вызов msg...
Дополнительная проблема
msg() method invoked
Вызов m...
Дополнительная проблема
Метод m() вызван
Вызов k...
Дополнительная проблема
Метод k() вызван

Как вы видите, до вызова методов msg(), m() и k() также выводятся другие проблемы.


2. Пример AOP: после

После вызова реального бизнес-логического метода был применен AspectJ после уведомления. Это можно использовать для поддержания журналов, безопасности, уведомлений и т.д.

Здесь мы предполагаем Operation.java , TrackOperation.java и Test.java Файл аналогичен примерам в aop:

Теперь создайте файл 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>

Вывод

вызов msg...
msg() method invoked
Дополнительная проблема
Вызов m...
Метод m() вызван
Дополнительная проблема
Вызов k...
Метод k() вызван
Дополнительная проблема

Вы можете видеть, что после вызова методов msg(), m() и k() возникает еще несколько проблем.


3. Пример AOP: после возвращения

Используя после возвращения предложения, мы можем получить результат в предложении.

Создание

файл: Operation.java

package com.w3codebox;
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.w3codebox;
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);
		System.out.println("Конец после возвращения совета...");
	}
}

файл: 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.w3codebox;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test{
	public static void main(String[] args){
		ApplicationContext контекст = new ClassPathXmlApplicationContext("applicationContext.xml");
		Operation e = (Operation) context.getBean("opBean");
		System.out.println("Вызов m...");
		System.out.println(e.m());
		System.out.println("Вызов k...");
		System.out.println(e.k());
	}
}

Вывод

Вызов m...
Метод m() вызван
Дополнительная проблема
Подпись метода: int com.w3codebox.Operation.m()
Результат в совете: 2
Конец после возвращения совета...
2
Вызов k...
Метод k() вызван
Дополнительная проблема
Подпись метода: int com.w3codebox.Operation.k()
Результат в совете: 3
Конец после возвращения совета...
3

Вы можете видеть, что возвращаемое значение напечатано дважды, сначала классом TrackOperation, а затем классом Test.


4. aop: around

Рекомендуется использовать AspectJ вокруг до и после применения реальной бизнес-логики метода.

Создать класс

файл: Operation.java

package com.w3codebox;
public  class Operation{
	public void msg(){System.out.println("msg() is invoked");}
	public void display(){System.out.println("display() вызван");}
}

Создайте класс аспектов, содержащий окружающий совет.

Вам нужно передать в метод совета PreceedingJoinPoint ссылка, чтобы мы могли через вызов proceed выполнить запрос() метод.

файл: TrackOperation.java

package com.w3codebox;
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.w3codebox;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test{
	public static void main(String[] args){
		ApplicationContext контекст = new classPathXmlApplicationContext("applicationContext.xml");
		Operation op = (Operation) context.getBean("opBean");
		op.msg();
		op.display();
	}
}

Вывод

Дополнительные опасения перед вызовом реального метода
Вызван msg()
Дополнительные опасения после вызова реального метода
Дополнительные опасения перед вызовом реального метода
Вызван display()
Дополнительные опасения после вызова реального метода

Вы можете видеть, что перед вызовом msg() и отображением метода также печатаются другие вопросы.


5. aop: after-throwing

Используя совет после броска, мы можем напечатать исключение в классе TrackOperation. Давайте посмотрим на пример совета AspectJ AfterThrowing.

Создать класс, содержащий бизнес-логику.

файл: Operation.java

package com.w3codebox;
public  class Operation{
	public void validate(int age)throws Exception{
	if(age<18){
		throw new ArithmeticException("Неvalidный возраст");
	}
	else{
		System.out.println("Спасибо for vote);
	}
	}
}

Создать класс стороны, содержащий совет после его вызова.

здесь нам нужно передать ссылку на Throwable, чтобы мы могли перехватывать исключения здесь.

файл: TrackOperation.java

package com.w3codebox;
import org.aspectj.lang.JoinPoint;
public class TrackOperation{
	public void myadvice(JoinPoint jp,Throwable error)//это совет
	{
		System.out.println("дополнительная проблема");
		System.out.println("Подпись метода: "+jp.getSignature());
		System.out.println("Исключение: "+error);
		System.out.println("конец после抛出 совета...");
	}
}

файл: 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.w3codebox;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test{
	public static void main(String[] args){
		ApplicationContext контекст = new ClassPathXmlApplicationContext("applicationContext.xml");
		Operation op = (Operation) context.getBean("opBean");
		System.out.println("Вызов validate...");
		try{
			op.validate(19);
		catch(Exception e){System.out.println(e);}
		System.out.println("Повторный вызов validate again...");
		try{
		    op.validate(11);
		catch(Exception e){System.out.println(e);}
	}
}

Вывод

Вызов validate...
Спасибо за голосование
Повторный вызов validate...
Дополнительная проблема
Подпись метода: void com.w3codebox.Operation.validate(int)
Исключение: java.lang.ArithmeticException: Неvalidный возраст
Конец after throwing advice...
java.lang.ArithmeticException: Неvalidный возраст