spring使用<contextloadtimeweaver/>实现静态代理实现以及遇到的坑

编程

第一步:

创建要实现静态的类,以及Advice增强类实现,内容如下:

需要静态代理的类:

public interface IITestBean {

void test();

}

public class TestBean implements IITestBean {

@Override

public void test() {

System.out.println("test");

}

}

Advice增强类:

@Aspect

public class AspectTest {

@Pointcut("execution(* *.test(..))")

public void test() {

System.out.println("我切入了");

}

@Before("test()")

public void beforeTest() {

System.out.println("beforeTest()");

}

@After("test()")

public void afterTest() {

System.out.println("afterTest()");

}

@Around("test()")

public Object aroundTest(ProceedingJoinPoint p) {

System.out.println("before1");

Object o = null;

try {

o = p.proceed();

} catch (Throwable throwable) {

throwable.printStackTrace();

}

System.out.println("after1");

return o;

}

}

 

第二步:

在class目录下的META-INF(没有则创建)文件夹下建立aop.xml,内容如下

<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">

<aspectj>

<weaver>

<include within="com.zzx.study.aspect.*"/>

</weaver>

<aspects>

<aspect name="com.zzx.study.aspect.AspectTest"/>

</aspects>

</aspectj>

 

第三步:

编写spring的配置spring-aspect.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"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<bean id="test" class="com.zzx.study.aspect.TestBean"/>

<context:load-time-weaver/>

</beans>

 

第四步:

编写测试类,内容如下:

public class AspectTest {

public static void main(String[] args) {

ApplicationContext context = new ClassPathXmlApplicationContext("spring-aspect.xml");

TestBean bean = (TestBean)context.getBean("test");

bean.test();

}

}

 

第五步:

测试时,需下载并引入org.springframework.instrument.jar文件,在idea中配置如下:

 

第六步:

运行中遇到的问题

问题1:出现了一个java.lang.VerifyError: Expecting a stackmap frame at branch target 7错误

解决方法:idea中VM option,需加入-XX:-UseSplitVerifier

问题2:circular advice precedence错误

解决方法:

原因Advice增强器AspectTest,必须要按照@Before->@Around->@After编写代码,上面代码调整顺利即可。但是在spring动态代理没有该顺序不对,不会抛异常。

 

第七步:

我们可以看到正常的静态类代理结果如下:

以上是 spring使用&lt;contextloadtimeweaver/&gt;实现静态代理实现以及遇到的坑 的全部内容, 来源链接: utcz.com/z/510485.html

回到顶部