![](/img/trans.png)
[英]Safe for inner AsyncTask to access outer Activity class private member fields?
[英]Spring: Injecting a private inner class as an outer class's member?
我有以下类结构
public class Outer{
private Mapper a;
....
private class MapperA implements Mapper {
}
private class MapperB implements Mapper {
}
}
在我的Spring配置文件中,我想创建一个外部bean,并将MapperA或MapperB中的一个指定为属性。 这可能吗?
<bean id="outer" class="mypackage.Outer">
<property name="a" ?????='????' />
</bean>
编辑:根据答案的反馈更多信息:
我上面的例子让我很懒。 我有一个Mapper实例变量的公共setter / getter。
所有Mapper类都是内部类的原因是因为它们可能有很多,并且它们只会在这个类中使用。 我只是不想在我的项目中使用大量的课程。 也许工厂方法是一个更好的主意。
Spring可以实例化private
内部类。 您的配置的实际问题是它们也是非static
,因此您需要<constructor-arg .../>
:
<bean id="outer" class="mypackage.Outer">
<property name = "a">
<bean class = "mypackage.Outer.MapperA">
<constructor-arg ref = "outer" />
</bean>
</property>
</bean>
通常,您需要在Outer
使用Mapper
的setter,以及所需Mapper
的实例。 但是因为这些是:
类,这有点棘手(正如你已经确定的那样)。 如果你公开它们,我相信你可以使用Outer$MapperA
等创建一个实例。但这似乎有点令人讨厌。 所以:
MapperA
或MapperB
。 即这里有一些工厂能力。 最简单的方法是真正确定它们是否需要内部/私有。 如果是这样,那么它们实际上不应该在配置中被引用,这应该是在讨论可公开访问的类。
据我所知,在你制作MapperA
和MapperB
常用的公共类之前是不可能的。
但是如果你确实希望将它们保留为内部私有类,那么你可以手动“注入”它们。
你需要使用@PostInit
注释创建方法并在那里初始化你的a
字段(例如a = new MapperA ()
,或者更复杂的东西)。 使用这种方法,您还应检查弹簧配置中是否已打开初始化回调。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.