我有一个实例化类B的类A,它反过来对C类做同样的事情,形成一棵大树。我现在需要实例化一个应该在整个树中都可用的对象,并且我不想在所有类中手动单独注入该对象。我不想使用静态,因为可能有不同的A类实例在不同的线程中并发运行,并且每个线程的共享对象必须是唯一的。我对线程安全操作没有多少经验。
答案 0 :(得分:1)
使用Spring
来管理实例。这样你就可以将你的实例注入到需要它的任何类中,如果父类的创建是spring管理的,那么注入的bean将被填充。
更详细地说,你可以做的是定义一个类。
public class MyBean {
// Add your class details.
}
确保Spring
为scanning its package,或者您已在applicationContext.xml
文件中定义了此类this。下一阶段是使用inject
注释@Autowired
您需要的bean。
@Autowired
private MyBean myBean;
在创建该类时,myBean
将填充最初创建的MyBean
的相同实例。
<强>优点强>
这样做意味着您的解决方案可以很好地扩展。您可以将其注入任何地方而无需不断更改构造函数(当您在类之间创建越来越多的子类和关系时,这是Shotgun Surgery的主要候选者。
了解行业中使用的技术总是很好。
使用其他方法(如Singleton
模式)管理类的单个实例通常是个坏主意。
<强>缺点强>
额外阅读
看看basic Spring tutorial让你前进。
查看可以创建bean的不同scopes,以防其中一些更适合您的需求。
答案 1 :(得分:0)
您需要在要使用该对象的上下文中使用本地引用,或者您需要静态引用。由于您不想使用静态,因此需要获取本地引用。您可以通过在构造函数中传递对象或添加setter方法来完成此操作。然后在树中向上构建您在所需对象中传递的子节点。
答案 2 :(得分:0)
你可以拥有一种&#34; Parallel Singleton&#34;所以说,也就是说,在一个以线程相关对象为关键字的哈希映射中,它不会只有一个实例,而是保留与线程一样多的实例。