最近更新: 2010-08-11

Java Spring framework 開發人員面試題

日前我指導公司一位新進人員學習 Java Spring framework 的基礎觀念。在這個過程中,我留意到 Java Spring framework 一些相當基礎而簡單的觀念很適合設計成問答題。所以我設計了三道連環的試題,檢視開發人員是否真的搞懂了。

唉,為什麼我這個討厭 Java 語言的人還會跑去指導別人關於 Java Spring framework 的事呢?總歸一句話:人在江湖身不由己。我也是要混飯吃的,就別問我原因了。

Question 1

今有一 PlainOldClass 類,其定義如下列。

class PlainOldClass {
    private int value;
    
    public PlainOldClass(int v) {
        this.value = v;
    }

    public int getValue() {
        return this.value;
    }
}

PlainOldClass 是一個既有類別,試用 Spring framework 的 bean 語法定義它,以1為其初值。

<bean id="plainOldClass" class="PlainOldClass">
    <constructor-arg>
        <value>1</value>
    </constructor-arg>
</bean>

Question 2

在應用程式的 Spring 配置文件中,有下列 bean 定義。

<bean id="newClass" class="NewClass">
    <property name="value">
        <ref bean="plainOldClass"/>
    </property>
</bean>

應用程式包含一個 ExampleComponent 元件,其定義如下列。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class ExampleComponent {

	@Autowired
	private NewClass c;
	
	public int test() {
	    return c.getValue();
	}
}

根據上述 Spring framework 的 bean 定義內容以及 ExampleComponent 的內容,試以 Java 語言寫出可用的 NewClass 類別。

class NewClass {
    private PlainOldClass value;
    public setValue(PlainOldClass v) {
        this.value = v;
    }

    public int getValue() {
        return this.value.getValue();
    }
}

Question 3

承前兩題,試描述 Spring framework 做了哪些事,使得 ExampleComponent 之中不需要寫出如何初始化 c 的程式碼。

//根據 bean plainOldClass
plainOldClass = new PlainOldClass(1);

//根據 bean newClass
newClass = new NewClass();
newClass.setValue(plainOldClass);

//根據 @Autowired  
component.c = newClass;
相關文章
樂多舊網址: http://blog.roodo.com/rocksaying/archives/13401403.html

樂多舊回應
未留名 (#comment-22133767)
Thu, 17 Nov 2011 17:32:58 +0800
第3題,ExampleComponent 裡面 private NewClass c,似乎會有 compile error:

//根據 @Autowired
component.c = newClass;
未留名 (#comment-22138959)
Tue, 22 Nov 2011 15:34:42 +0800
Spring framework 實際上是透過 reflect 完成 autowired 的。大致上是:

ExampleComponent component = new ExampleComponent();
Field field = ExampleComponent.class.getField("c");
field.set(component, newClass);

而上述的反射操作,白話地說就是 component.c = newClass;

有興趣深入了解的話,可以參考我寫的 http://blog.roodo.com/rocksaying/archives/13163105.html。
在 JNI 與 java.reflect 眼中,存取權飾詞只是參考用的。

畢竟我的題目測試的不是 relfect 的用法,而是 Spring framework 的基礎觀念。能寫出參考答案中的 pseudo code 足以。因為這代表作答者理解 Autowired 作了什麼。
事實上,我在提問時,還真有些Spring framework的使用者連這一點都答不出來。
nbrenhu@msn.com(Ren) (#comment-22778008)
Fri, 08 Feb 2013 13:38:36 +0800
在實作上,記住這些關係的code是沒多大意義的,
我也沒有很熟悉 Spring,可是Spring的系統卻改過不少個,
考試這件事,見仁見智,只是如果是我,不會叫人去記這些書上就找的到的東西。
未留名 (#comment-22778204)
Fri, 08 Feb 2013 14:52:39 +0800
我不需要他們記住這些code 。
如果他們真的理解 Spring 的基礎觀念,寫出那些 code 不必靠記憶。

我出這三道題目時,我會在旁觀察解答者。
前兩題就算有些關鍵字或語法記不起來也無妨,那不太重要。
真正重要的只有第三道問題的答案,那才是真正的基礎觀念。

連基礎觀念都沒有建立的程序員,只能算是看書打字的打字員。
ss@ss.ss(ss) (#comment-22801440)
Thu, 07 Mar 2013 13:17:21 +0800
這年頭看文件的人越來越少了
這些東西~官方文件都有阿