Autowiring a collection via the constructor with Spring

后端 未结 4 1271
栀梦
栀梦 2021-02-07 01:31

I have what seems to be a simple problem, as stated in the title. Here is the kind of class I have :

public class Foo {
    @Autowired
    public Foo(@Qualifier(         


        
相关标签:
4条回答
  • 2021-02-07 01:48

    Autowiring collections is not possible using the @Autowired annotation. An autowired collection means "to provide all beans of a particular type". Using the JSR-250 @Resource annotation, you can declare that you want a resource injected by its name, not its type. Or you inject the dependency explicitly.

    [...] beans which are themselves defined as a collection or map type cannot be injected via @Autowired since type matching is not properly applicable to them. Use @Resource for such beans, referring to the specific collection/map bean by unique name.

    See the Spring documentation for more details.

    0 讨论(0)
  • 2021-02-07 01:53

    I think this is because Spring interprets the autowiring of a collection as "give me all beans of type String", rather than "give me the bean which is a collection of String". The error message supports that idea.

    I don't think you can use autowiring for this. Short of manually wiring it up in the XML, the best I can suggest is:

    public class Foo {  
       private @Resource Set<String> bar;
    }
    
    0 讨论(0)
  • 2021-02-07 01:55

    I had this same problem and was inspired by @rembisz's answer. That answer didn't work on my version of Spring (4.1.3). When I checked the SpEL documentation on bean references, I found a different SpEL syntax to express bean references in autowired values that worked for me - @beanname. As such, the following code worked for me:

    public class Foo {
        @Autowired
        public Foo(@Value("#{@bar}") Set<String> bar) {
            // ...
        }
    }
    
    0 讨论(0)
  • 2021-02-07 02:03

    As others stated it is impossible to use @Autowired for Strings and collections of String. You can use @Value with spring EL here assuming you have spring in version 3:

    public class Foo {
        @Autowired
        public Foo(@Value("#{bar}") Set<String> bar) {
            // ...
        }
    }
    
    0 讨论(0)
提交回复
热议问题