2013-06-18 48 views
3

我是SpringAOP的新手。我想寫一個簡單的例子介紹,但不能清楚地知道它是如何工作的。SpringAOP引入AspectJ

在文檔我發現:

Introduction: declaring additional methods or fields on behalf of a type. Spring AOP allows you to introduce new interfaces (and a corresponding implementation) to any advised object. For example, you could use an introduction to make a bean implement an IsModified interface, to simplify caching. (An introduction is known as an inter-type declaration in the AspectJ community.)

我寫簡單的例子: 我寫簡單的類的一個方法

public class Test { 
    public void test1(){ 
     System.out.println("Test1"); 
    } 
} 

然後我寫的接口和類實現此接口

public interface ITest2 { 
    void test2(); 
} 

public class Test2Impl implements ITest2{ 
    @Override 
    public void test2() { 
     System.out.println("Test2"); 
    } 
} 

,最後我的方面

@Aspect 
public class AspectClass { 

    @DeclareParents(
      value = "by.bulgak.test.Test+", 
      defaultImpl = Test2Impl.class 
    ) 
    public static ITest2 test2; 
} 

我的Spring配置文件是這樣的:

<aop:aspectj-autoproxy/> 
<bean id="aspect" class="by.bulgak.aspect.AspectClass" /> 

所以我的問題: 我哪有你現在這樣。我需要在我的主課中寫出什麼樣的海洋結果? 。 可能我需要寫一些其他類(本書中,我讀到SpringAOP我無法找到完整的例子)

UPDATE

我的主要方法是這樣的:

public static void main(String[] args) { 
    ApplicationContext appContext = new ClassPathXmlApplicationContext("spring-configuration.xml"); 
    Test test = (Test) appContext.getBean("test"); 
    test.test1(); 
    ITest2 test2 = (ITest2) appContext.getBean("test"); 
    test2.test2(); 

} 

當我執行我的應用程序我得到這個錯誤:

Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy5 cannot be cast to by.bulgak.test.Test 

在這一行:

Test test = (Test) appContext.getBean("test"); 
+0

讓我看看你的配置文件中的'Test' bean聲明。 –

+0

@RohitJain'' –

+0

@RohitJain但項目工作正常II評論這兩行:'Test test =(Test)appContext.getBean(」test「); test.test1();' –

回答

3

首先,你需要在配置文件中定義bean Test

<bean id="test" class="Test" /> 

然後在主,讓這個bean從ApplicationContext

Test test1 = (Test) context.getBean("test"); 

現在,從test1參考,您只能調用Test bean中定義的方法。要使用新引進的行爲,就需要強制轉換引用到包含行爲的界面:

ITest2 test2 = (ITest2) context.getBean("test"); 

然後,你可以從這個引用訪問的Test2方法:

test2.test2(); 

這將調用該bean在defaultImpl屬性@DeclareParents註釋中指定的方法中定義的方法。

+0

當我啓動應用程序時,錯誤:線程中的異常「main」java.lang.ClassCastException:com.sun.proxy。$ Proxy5無法轉換爲by.bulgak.test.Test' –

+0

你在哪裏得到這個異常? –