我有一个由相当大的对象图组成的域模型,其中域对象正在创建其他域对象,依此类推。为了各种目的,每个域对象都需要访问少量单例类型的辅助对象。
当我记得我已经在使用Spring时,我正准备使用Java单例模式实现它们,我可以使用Spring在应用程序启动时实例化这些帮助程序中的每一个。我的问题是如何在域对象中找到它们?这些都是通过“new”运算符创建的对象,不受Spring的控制。
我想我可以使用“getBean”方法,如果我掌握了Spring应用程序上下文(我没有) - 但这是好的表现吗?我需要这些东西快速...以及如何快速获取应用程序上下文?
答案 0 :(得分:3)
在典型的Spring应用程序中,您所描述的跨实体逻辑通常在业务服务层(即Spring管理的单例)中实现,而不是域对象。 Spring应用程序中的域类往往是相当简单的数据容器,可能有一些方法可以对它们封装的数据执行基本操作,但是远远不能自行管理复杂的对象图。因此,业务服务对象管理域对象,而不是相反。
但是,如果您坚持将单例注入域对象,则可以使用AspectJ来实现此目的。 Spring本身并不支持这一点。
答案 1 :(得分:2)
答案 2 :(得分:2)
public class SpringApplicationContextProvider implements ApplicationContextAware {
public void setApplicationContext(ApplicationContext ctx)
throws BeansException {
// Wiring the ApplicationContext into a static method
SpringApplicationContext.setApplicationContext(ctx);
}
}
将SpringApplicationContext定义为
public class SpringApplicationContext {
private static ApplicationContext ctx;
public static void setApplicationContext(
ApplicationContext applicationContext) {
ctx = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return ctx;
}
private SpringApplicationContext(){
}
}
将SpringApplicationContextProvider定义为配置文件中的spring bean。现在可以使用此提供程序访问应用程序上下文。