2011-08-10 37 views
0

我想合併這兩種方法使用泛型,唯一的區別是鑄造類「ServicesBO」和「ServicesDAO」。該bean的名稱可以作爲字符串參數傳遞。是否有可能使用泛型來將它們合併到鑄造類中?泛型與彈簧

private void getFieldBO(){ 
    ServicesBO services = (ServicesBO)appContext.getBean("ServicesBo"); 
    List<users> list = services.getUsers(); 

    for (users user: list) 
     System.out.println("BO: " + user.getName()); 
} 

private void getFieldDAO(){ 
    ServicesDAO services = (ServicesDAO)appContext.getBean("ServicesDAO"); 
    List<users> list = services.getUsers(); 

    for (users user: list) 
     System.out.println("DAO: " + user.getName()); 
} 

在此先感謝 查克。

+0

你不需要這種泛型。 – Tom

回答

1

平原多態現象有什麼問題?

定義一個接口,並在ServicesDaoServicesBO

public interface UserProvider{ 

    List<users> getUsers(); 
} 

然後實現它,你可以

UserProvider services = (UserProvider)appContext.getBean(beanName); 

    List<users> list = services.getUsers(); 

    for (users user: list){ /* do stuff with user*/} 
+0

非常好,謝謝! – Chuck

0

解決這個簡單的方法是同時擁有你的服務對象實現共同的接口。喜歡的東西:

public interface UserSource { 
    List<users> getUsers(); 
} 

您又將ServicesBOServicesDAO爲實現這個接口,它允許你做:

private void getFieldProvider(String providerName){ 
    UserSource services = (UserSource)appContext.getBean(providerName); 
    List<users> list = services.getUsers(); 

    for (users user: list) 
     System.out.println(providerName + ": " + user.getName()); 
} 

更復雜的方法是使用反射,它允許你這樣做不需要提供服務對象共享的接口。例如,您可以執行以下操作:

private void getFieldProvider(String providerName){ 
    Object services = appContext.getBean(providerName); 
    List<users> list = Collections.emptyList(); 
    try { 
     Method method = services.getClass().getMethod("getUsers"); 
     list = (List<users>)method.invoke(services); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 

    for (users user: list) 
     System.out.println(providerName + ": " + user.getName()) 
} 
+0

啊是的!,這兩種情況,非常感謝! – Chuck

2

如果沒有ServicesDao和ServicesBO實現的通用接口,您將無法在沒有反射的情況下調用getUsers。

所以假設你有一個共同的接口:

public interface UserProvider { 
    List<User> getUsers(); 
} 

您可以定義方法如下:

private void printUsers(String beanName) { 
    UserProvider provider = appContext.getBean(beanName, UserProvider.class); 
    List<User> users = provider.getUsers(); 

    for (User user : users) 
     System.out.println("DAO:" + user.getName()); 
} 

一對夫婦的其他東西:

  • 通常班級名稱以大寫字母開頭(用戶不是用戶)
  • cla SS名稱可能應該是User,因爲getName方法建議該類只保存一個用戶
  • 我認爲使用spring來注入bean比從應用程序上下文中查找更好。

希望有幫助。

+0

卓越,感謝您的快速響應。 – Chuck

+0

卓越,感謝您的快速響應! 我想編輯代碼使問題儘可能簡單,「用戶」是假類,但是,你說的對,它應該是「用戶」。 Im新的Java/Spring和我正在使用註釋,所以這就是爲什麼我使用 的應用程序上下文。 再次感謝,非常好的答案和提示。 – Chuck