将Spring依赖注入到匿名实现中

时间:2011-01-15 23:31:57

标签: java spring dependency-injection

我有一个抽象基类,我用于服务,包括各种方法的实现,以及一个抽象方法。我有一些密切相关的实体,我想在一个服务中管理,所以我计划将该服务组成为这些实体的抽象基础服务的匿名实现。我想将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移动到包含类中,那么它可以正常工作。我把它留在包含的类中,但是想知道将它注入匿名类实现需要什么。

3 个答案:

答案 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上下文的一部分。

但总的来说,我认为创建如此多的样板代码并不是一个好主意。应该有一种方法可以获得更优化的解决方案(我无法看到因为我没有全局)