spring使用 實現靜態代理實現以及遇到的坑

第一步:java

建立要實現靜態的類,以及Advice加強類實現,內容以下:spring

須要靜態代理的類:eclipse

public interface IITestBean {
    void test();
}
public class TestBean implements IITestBean {
    @Override
    public void test() {
        System.out.println("test");
    }
}

Advice加強類:ide

@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,內容以下idea

<!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>

 

第三步:spa

編寫spring的配置spring-aspect.xml,內容以下:3d

<?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>

 

第四步:代理

編寫測試類,內容以下:xml

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動態代理沒有該順序不對,不會拋異常。

 

第七步:

咱們能夠看到正常的靜態類代理結果以下:

相關文章
相關標籤/搜索