Spring静态访问应用程序上下文

时间:2015-09-20 02:56:57

标签: spring

我有一个这样的课程:

public class Spring implements ApplicationContextAware{

    private static ApplicationContext CONTEXT;

    public static <T> T getBean(Class<T> clz){
        return CONTEXT.getBean(clz);
    }

    public static Object getBean(String s){
        return CONTEXT.getBean(s);
    }

    public static <T> T getBean(String s, Class<T> clz){
        return CONTEXT.getBean(s, clz);
    }

    public static Object getBean(String s, Object... objs){
        return CONTEXT.getBean(s, objs);
    }

    @Override
    // TODO how to protect this method ?
    public void setApplicationContext(ApplicationContext ac) throws BeansException {    
        Spring.CONTEXT = ac;
    }

    public static <T> T eal(Object o, String expression, Class<T> clz){
        ExpressionParser parser = new SpelExpressionParser();
        Expression exp = parser.parseExpression(expression);
        return exp.getValue(o, clz);
    }

}

定义如下:

<bean id="springApplicationContext" class="org.codingfarm.cwe.Spring"/>

setApplicationContext方法是公开的,我如何从客户端代码中保护此方法?

顺便说一下,这在现实世界的应用中是不好的做法吗?

有什么更好的方式来做我想要的事情吗?

修改

我想我可以像这样进行空检查:

public void setApplicationContext(ApplicationContext ac) throws BeansException {
        if(CONTEXT == null)
            CONTEXT = ac;
    }

那么当servlet容器重新加载我的应用程序时,是否需要清除此静态CONTEXT字段?

1 个答案:

答案 0 :(得分:1)

  顺便说一下,这在现实世界的应用中是不好的做法吗?

是的,这是非常糟糕的做法。它基本上与依赖注入相反。通过使用静态方法访问ApplicationContext中的bean,您已经破坏了测试任何代码或从依赖注入模式中受益的能力。

您应该使用@Inject来获取已经通过构造函数连接其依赖项的类的实例。