当前位置:  开发笔记 > 编程语言 > 正文

Spring IoC和通用接口类型

如何解决《SpringIoC和通用接口类型》经验,为你挑选了2个好方法。

我正在尝试使用Spring IoC这样的接口:

public interface ISimpleService {
    void someOp(T t);
    T otherOp();
}

Spring可以根据泛型类型参数T提供IoC吗?我的意思是,像这样:

public class SpringIocTest {
    @Autowired
    ISimpleService longSvc;

    @Autowired
    ISimpleService strSvc;
    //...
}

当然,我上面的例子不起作用:

expected single matching bean but found 2: [serviceLong, serviceString]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessAfterInstantiation(AutowiredAnnotationBeanPostProcessor.java:243)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:957)

我的问题:是否可以提供类似的功能,只需对接口或实现类进行最少的修改?我知道我可以使用@Qualifiers,但我希望尽可能简单.



1> krosenvold..:

由于擦除,我不相信这是可能的.在进行全自动装配时,我们通常会切换到强类型子接口:

public interface LongService extends ISimpleService {}
public interface StringService extends ISimpleService {}

在进行此切换时,我们发现我们实际上非常喜欢这个,因为它允许我们更好地"查找使用"跟踪,使用泛型接口松散.



2> Michael Pral..:

如果没有资格赛,我不认为这是可能的

我试着用genericDAO展示我的解决方案,对不起,如果它有点详细

接口和实现类定义

public interface GenericDAO (...)

public class GenericDAOImpl
    implements GenericDAO 
    (...) important is this constructor
    public GenericDAOImpl(Class persistentClass) {
       this.persistentClass = persistentClass;
    }

spring bean定义,注意abstract ="true"


    
        
    
    

使用此genericDAO无需特殊实现类

 
    
    
        de.optimum24.av.pers.test.hibernate.domain.TOChild
    

注意带有具体类的constructor-arg,如果你使用Spring Annotation,你需要做:

@Autowired
@Qualifier(value = "testHibernateChildDao")
private GenericDAO ToChildDAO;

区分genericDao Beans的各种版本(注意限定符直接引用Beanname)

将此genericDAO与特殊实现类一起使用

接口和类

public interface TestHibernateParentDAO extends GenericDAO{
  void foo();
}
public class TestHibernateParentDAOImpl extends GenericDAOImpl
                              implements TestHibernateParentDAO {
  @Override
  public void foo() {
      //* no-op */
  }
}

Bean定义,请注意上面的抽象genericDAO的"父"参考


和Spring Annotation的用法

@Autowired
private TestHibernateParentDAO ToParentDAO;

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有