从域对象中访问Spring单例的好方法?

我有一个域模型,它由相当大的对象图组成,其中域对象正在创建其他域对象,依此类推。 为了各种目的,每个域对象都需要访问少量单例类型的辅助对象。

当我记得我已经在使用Spring时,我正准备使用Java单例模式实现它们,我可以使用Spring在应用程序启动时实例化这些帮助程序中的每一个。

我的问题是如何从我的域对象中找到它们? 这些都是通过“new”运算符创建的对象,并且不受Spring的控制。

我想我可以使用“getBean”方法,如果我掌握了Spring应用程序上下文(我没有) – 但这是好的表现吗? 我需要这些东西快速…以及如何快速获取应用程序上下文?

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。 现在可以使用此提供程序访问应用程序上下文。

在典型的Spring应用程序中,您所描述的跨实体逻辑通常在业务服务层(即Spring管理的单例)中实现,而不是域对象。 Spring应用程序中的域类往往是相当简单的数据容器,可能有一些方法可以对它们封装的数据执行基本操作,但是远远不能自行管理复杂的对象图。 因此,业务服务对象管理域对象,而不是相反。

但是,如果您坚持将单例注入域对象,则可以使用AspectJ实现此目的。 Spring本身并不支持这一点。

看看问题的答案@ 将bean注入Spring托管上下文之外的类