package com.zhoujian.spring.aspect;
import org.apache.catalina.tribes.util.Arrays;
import org.aspectj.lang.JoinPoint;
public class LogAspectClassWithXML {
public void beforeLog(JoinPoint point){
System.out.println("Before:增强的目标方法名为:" + point.getSignature().getName());
System.out.println("Before:增强的目标方法的参数为:" + Arrays.toString(point.getArgs()));
System.out.println("Before:被织入增强的目标对象为:" + point.getTarget());
}
public void after(JoinPoint point) {
/**
* after增强处理,不管目标方法是如何结束的,该方法会在目标方法结束之后被织入
* 如果对同一目标方法进行了after和afterReturning增强处理且目标方法正常执行结束,
* 此时会先织入after增强处理,之后才是afterReturning增强处理,
* 如果目标方法非正常结束, 那么只会在目标方法结束之后,织入after增强处理,
* 如果目标方法的非正常结束抛出了异常,那么会在目标方法结束之后,先织入after增强处理,
* 之后才会织入afterThrowing增强处理
*/
System.out.println("After: 目标方法结束后释放资源...");
System.out.println("After:增强的目标方法名为:" + point.getSignature().getName());
System.out.println("After:增强的目标方法的参数为:" + Arrays.toString(point.getArgs()));
System.out.println("After:被织入增强的目标对象为:" + point.getTarget());
}
public void afterReturning(JoinPoint point, Object returnVal) {
System.out.println("AfterReturning: 获取目标方法的返回值" + returnVal);
System.out.println("AfterReturning:增强的目标方法名为:" + point.getSignature().getName());
System.out.println("AfterReturning:增强的目标方法的参数为:" + Arrays.toString(point.getArgs()));
System.out.println("AfterReturning:被织入增强的目标对象为:" + point.getTarget());
}
public void afterThrowing(JoinPoint point, Exception exception, String name, String age){
System.out.println("AfterThrowing: 获取到目标方法抛出的异常" + exception.getMessage());
System.out.println("AfterThrowing:增强的目标方法名为:" + point.getSignature().getName());
System.out.println("AfterThrowing:增强的目标方法的参数为:" + Arrays.toString(point.getArgs()));
System.out.println("AfterThrowing:被织入增强的目标对象为:" + point.getTarget());
}
}
3、测试类 AspectWithXMLTest
package com.zhoujian.spring.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.zhoujian.spring.anno.HelloImpl2;
public class AspectWithXMLTest {
@Test
public void test() {
ApplicationContext ac = new ClassPathXmlApplicationContext("aspectWithXML.xml");
System.out.println(ac.getBean("helloImpl").getClass().getName());
/**
* helloImpl 实体类实现了一个接口,所以其代理类的获取必须使用其实现的接口进行获取,不然会发生类型转换异常
*/
com.zhoujian.spring.anno.Hello hel = (com.zhoujian.spring.anno.Hello) ac.getBean("helloImpl");
hel.foo();
}
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("aspectWithXML.xml");
/**
* 单实体类:即没有继承和实现任何类和接口的实体类, 在获取其代理对象的时候,直接获取就行了
* 即使目标类继承了一个或者多个类,获取时正常获取即可,用其父类进行获取也行
*/
System.out.println(ac.getBean("helloImpl").getClass().getName());
HelloImpl2 hel = (HelloImpl2) ac.getBean("helloImpl2");
hel.foo();
}
}
注:Spring AOP 由 IOC 容器进行生成和管理,当进行IOC容器创建的时候,IOC容器会扫描切入点表达式所包含的所有包中所有类,并为所有类创建代理对象
如果目标类没有实现任何的接口,Spring将会是cglib方式创建代理对象;
如果目标类实现了一个或多个接口或者,那么Spring将会采用JDK动态代理创建代理类(此时代理类的获取必须使用接口类型接收)
使用Spring版本:spring-framework-4.3.10.RELEASE-dist