我有一个这样的课程:
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字段?
答案 0 :(得分:1)
顺便说一下,这在现实世界的应用中是不好的做法吗?
是的,这是非常糟糕的做法。它基本上与依赖注入相反。通过使用静态方法访问ApplicationContext
中的bean,您已经破坏了测试任何代码或从依赖注入模式中受益的能力。
您应该使用@Inject
来获取已经通过构造函数连接其依赖项的类的实例。