【问题标题】:How to hide method from the Spring bean?如何从 Spring bean 中隐藏方法?
【发布时间】:2010-06-26 18:29:19
【问题描述】:

我有一个扩展其他 Java 文件的 bean。当我创建一个 Spring bean 时,所有公共方法(来自我的和来自扩展文件的)都被公开。如何在 bean XML 配置中隐藏不需要的方法,使它们不被暴露?

补充说明:

我通过 RDS for Flex 应用程序公开了我的 bean。所以,我的 bean 可以通过网络获得。使用不需要的方法我有两个问题:

  1. 安全性 - 任何人都可以调用我从 JdbcDaoSupport 继承的 setDataSource 或其他任何东西。我认为这太疯狂了 :-)
  2. 因为我使用 RDS for Flex Builder,它会自动为我的 Flex 应用程序创建远程对象。我的 Flex 应用程序中提供了 setDataSource 等所有方法。这不好。我当然可以将它们切断,但第一点仍然存在。

【问题讨论】:

标签: java spring


【解决方案1】:

如果继承的方法不应该被访问,也许你应该使用聚合而不是继承?

因为任何代码都可以调用该对象上的公共继承方法,所以这不是 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!");
}

【讨论】:

  • 这是个好主意!我为我的问题找到了更简单的解决方案,但您的解释绝对是最佳答案。谢谢!
【解决方案2】:

其实我问错了。我的问题有解决方案,如下所示:http://static.springsource.org/spring-flex/docs/1.0.x/reference/html/ch03s03.html

【讨论】:

    【解决方案3】:

    我有点困惑,为什么你在乎春天看到他们?我最初的想法是“将它们设为私有或受保护”。

    【讨论】:

      【解决方案4】:

      您可以尝试关闭自动装配。毕竟这只是一种方便。在您的 bean 配置文件中“手动”执行此操作将更好地记录连接到什么的内容……

      【讨论】:

        猜你喜欢
        • 2011-02-18
        • 2012-01-17
        • 1970-01-01
        • 1970-01-01
        • 2012-02-23
        • 1970-01-01
        • 2013-10-15
        • 1970-01-01
        相关资源
        最近更新 更多