代码之家  ›  专栏  ›  技术社区  ›  Иван Гладуш

spring中基于bean的通用值是如何自动连接的?

  •  0
  • Иван Гладуш  · 技术社区  · 6 年前

    我有以下代码结构

    @Component
    public class MyServiceUser{
        @Autowired
        private MyService<FirstMyDao> dao;
    
    }
    
    @Service
    public class MyService<T extends AbstractMyDao>{
    
        @Autowired
        private T myDao;
    }
    
    abstract class AbstractMyDao{}
    @Repository
    class FirstMyDao extends AbstractMyDao{}
    
    @Repository
    class SecondMyDao extends AbstractMyDao{}
    

    Spring说,他无法解决哪种类型的dao已投入使用我能做吗? 我读了几篇文章,但没有找到答案( https://blog.jayway.com/2013/11/03/spring-and-autowiring-of-generic-types/ , How to Autowire Bean of generic type <T> in Spring? )中。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Piotr Rogowski    6 年前

    我觉得你应该用 @Scope("prototype") 在里面 MyService

    作用域prototyp的Bean是为注入它的每个对象创建的。

    例子:

    @Service
    @Scope("prototype")
    public class MyService<T extends AbstractMyDao>{
    
        @Autowired
        private T myDao;
    }
    
        2
  •  2
  •   mikeb    6 年前

    我通常会这样做:

    public class MyService<T extends AbstractMyDao>{
    
        private T myDao;
        public MyService(T dao){
            myDao = dao;
        }
    }
    
    @Configuration
    public class ServiceConfig {
       @Bean 
       public MyService<FirstMyDao> myServiceFirstMyDao(FirstMyDao fmd){
            return new MyService(fmd);
       }
    }
    

    这应该管用,因为 FirstMyDao fmd 会自动连线然后你会有一个可注射的豆子 MyService<FirstMyDao>

    请注意,删除 @Service 从泛型类中,因为Spring不知道 T 是。