2010-06-26 65 views
2

我有一個擴展其他Java文件的bean。當我創建一個Spring bean時,所有公共方法(來自我的和來自擴展文件)都被公開。如何在bean XML配置中隱藏不需要的方法,以便它們不被公開?如何從Spring bean中隱藏方法?

加解釋:

我通過RDS暴露我的豆Flex應用程序。所以,我的豆在網絡上可用。隨着不必要的方法,我有兩個問題:

  1. 安全 - 任何人都可以打電話給我的setDataSource另一個從JdbcDaoSupport繼承或其他任何東西。我覺得這只是瘋狂的:-)
  2. 由於我使用RDS針對Flex Builder,它爲我的Flex應用程序自動創建遠程對象。所有的方法,像setDataSource都可以在我的Flex應用程序中使用。哪個不好。當然,我可以把它們切斷,但是仍然有一個點。
+0

有可用的一個解決方案中使用AspectJ http://forum.springsource.org/archive/index.php/t-32469.html 但似乎過於複雜。必須有更好的解決方案。 – Worker 2010-06-26 19:28:50

回答

3

如果不應該訪問繼承的方法,也許應該使用聚合而不是繼承?

由於任何代碼都可以調用該對象上的公共繼承方法,因此這不是特定於spring的。

編輯:當你發現自己,遠程處理框架可以配置爲不公開所有方法。如果這種情況是不可能的,你也可以使用:

import java.lang.reflect.Proxy; 

public static <I> I restrictToInterface(final I instance, Class<I> publicInterface) { 
    Object proxy = Proxy.newProxyInstance(
     publicInterface.getClassLoader(), 
     new Class<?>[] {publicInterface}, 
     new InvocationHandler() { 
      @Override 
      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
       return method.invoke(instance, args); 
      } 
     } 
    ); 
    return publicInterface.cast(proxy); 
} 

測試代碼:

interface MyRemoteInterface { 
    void foo(Object bar); 
} 

class MyBeanImpl implements MyRemoteInterface { 
    @Override 
    public void foo(Object bar) { 
     System.out.println(bar); 
    } 

    public void dangerousMethodThatMustNotBeInvoked() { 
     // launch missiles 
    } 
} 

public static void main(String[] args) { 
    MyBeanImpl beanImpl = new MyBeanImpl(); 
    MyRemoteInterface remotableBean = restrictToInterface(beanImpl, MyRemoteInterface.class); 
    System.out.println("Remoteable Methods are:"); 
    for (Method m : remotableBean.getClass().getMethods()) { 
     if (!Modifier.isStatic(m.getModifiers())) { 
      System.out.println("\t" + m.getName()); 
     } 
    } 

    remotableBean.foo("Hello world!"); 
} 
+0

這是一個好主意!我發現我的問題更簡單的解決方案,但您的解釋絕對是獲得最佳答案。謝謝! – Worker 2010-06-27 05:01:37

0

我有點困惑爲什麼你在乎那春天看到他們?我最初的想法是「讓他們私密或受保護」。

0

您可以嘗試關閉自動裝配。畢竟這只是一種方便。在您的bean配置文件中「手動」執行此操作將提供更好的連接到什麼的記錄...