我有一个抽象基类,我用于服务,包括各种方法的实现,以及一个抽象方法。我有一些密切相关的实体,我想在一个服务中管理,所以我计划将该服务组成为这些实体的抽象基础服务的匿名实现。我想将Dao实现注入到匿名服务实现中。我试图做这样的事情。
@Configurable
@Service( value="compositeService" )
public class CompositeServiceImpl
extends BaseDataServiceAbstract<AnotherEntity, Long>
implements CompositeService
{
BaseDataServiceAbstract<MyObject, Long> myObjectService =
new BaseDataServiceAbstract<MyObject, Long>() {
@Resource( name="myObjectDao")
BaseDao<MyObject, Long> myObjectDao;
@Override
public BaseDao<MyObject, Long> getDao()
{
return myObjectDao;
}
};
// other implementation methods and stuff
}
如果我这样做,Dao不会被注射。如果我将dao移动到包含类中,那么它可以正常工作。我把它留在包含的类中,但是想知道将它注入匿名类实现需要什么。
答案 0 :(得分:3)
只要您自己调用new
,Spring就不会实例化该类,因此无法注入依赖项。
由于你不能在没有使用new调用默认构造函数的情况下创建匿名类,因此Spring无法帮助你。
答案 1 :(得分:2)
老实说,我不认为这是可能的。对于spring来注入dao,它必须在上下文加载器启动时首先实例化该bean。它不能这样做,因为它不知道它。它类似于你在构造函数中实例化的类:因为spring没有实例化它,它不知道它。我认为将dao添加到包含服务类是唯一可以让它工作的方法。或者,您可以始终只创建这些类的具体实例,并将它们添加到上下文xml中,并将它们注入到服务类中。然后你可以将dao注入其中,但我认为你首先没有这样做的原因。
答案 2 :(得分:2)
你不能直接这样做。但是,有2种解决方法:
在拥有类中注入Dao,并在@PostConsruct
中为每个匿名类调用一个setter,设置dao(即手动注入)
获取ApplicationContext
(实施ApplicationContextAware
,或者我认为自动装配它也可以),并在@PostConstruct
调用appContext.getAutowireCapableBeanFactory().autowireBean(myObjectService)
。这将告诉spring自动装配这些对象的依赖关系,即使对象本身不是spring上下文的一部分。
但总的来说,我认为创建如此多的样板代码并不是一个好主意。应该有一种方法可以获得更优化的解决方案(我无法看到因为我没有全局)