spring使用<contextloadtimeweaver/>实现静态代理实现以及遇到的坑
第一步:
创建要实现静态的类,以及Advice增强类实现,内容如下:
需要静态代理的类:
public interface IITestBean {void test();
}
public class TestBean implements IITestBean {@Override
public void test() {
System.out.println("test");
}
}
Advice增强类:
@Aspectpublic 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使用<contextloadtimeweaver/>实现静态代理实现以及遇到的坑 的全部内容, 来源链接: utcz.com/z/510485.html