Autowiring Unmanaged Beans Annotated With @Component

后端 未结 3 508
闹比i
闹比i 2020-12-28 12:11

I want to use @AutoWired to inject a non-managed bean configured with @Component into a managed bean. I\'m pretty sure I have the configuration right, but for some reason I

相关标签:
3条回答
  • 2020-12-28 12:15

    The previous response is not correct, in one aspect. You can autowire beans that are otherwise configured with xml.

    From section 3.4.5 in http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html:

    When using XML-based configuration metadata[2], you specify autowire mode for a bean definition with the autowire attribute of the element. The autowiring functionality has five modes. You specify autowiring per bean and thus can choose which ones to autowire.

    You can autowire by name, type and constructor. There is a crude example of this here: http://www.java2s.com/Code/Java/Spring/AutoWiring.htm

    0 讨论(0)
  • 2020-12-28 12:27

    Because Bar is configured with xml, it can only be configured with xml. i.e. you can't mix them. So that "@Autowired" annotation on Baz is not getting picked up (none of the annotations would be). It is only when you add the spring annotation at class level that spring will listen to any of the other annotations.

    What you'll need to do is in the xml configure the bean to be autowired by type, add a setter for that type and you'll achieve the desired behaviour.

    <bean id="bar" class="foo.Bar" autowire="byType"/>
    

    One more thing, when you annotate a bean with @Component it is a spring managed bean. Just because it is not created with xml does not mean it is unmanaged. An unmanaged bean is one you don't get from spring.

    Bar and Baz are both spring managed. It is the mechanism you've chosen to define them that differs.

    0 讨论(0)
  • 2020-12-28 12:33

    The error is due to the sequence of beans defined in your XML config file.

    As on your XML file, bean for bar is created first and then their dependent beans due to which @Autowired is not able to find baz.

    You must first declare bean for baz and then for bar.

    0 讨论(0)
提交回复
热议问题