【问题标题】:How autowired bean based generic value in spring?春季如何自动装配基于bean的通用值?
【发布时间】:2018-12-26 07:25:51
【问题描述】:

我有如下代码结构

@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?)。

【问题讨论】:

    标签: java spring


    【解决方案1】:

    我通常会这样做:

    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 将自动连接,然后您将拥有一个可注入的 bean MyService&lt;FirstMyDao&gt;

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

    【讨论】:

      【解决方案2】:

      我认为你应该在MyService中使用@Scope("prototype")

      为每个注入它的对象创建具有作用域原型的 Bean。

      例子:

      @Service
      @Scope("prototype")
      public class MyService<T extends AbstractMyDao>{
      
          @Autowired
          private T myDao;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-02
        • 2017-12-13
        • 2015-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多