使bean的成员可自动装配

时间:2018-11-10 20:17:35

标签: java spring autowired

@Component
class MultiProvider {
    public Foo getFoo();
    public Bar getBar();
}

@Component
class FooConsumer {
    FooConsumer(Foo f);
}

我可以将MultiProvider.getFoo()自动连接到FooConsumer构造函数中。.

  • 不使Foo本身成为一个bean(例如,因为Spring不应销毁它,因为MultiProvider的责任)
  • 并且没有引入从FooConsumerMultiProvider(或任何其他类)的依赖关系?

3 个答案:

答案 0 :(得分:0)

Spring只能自动连接已声明的bean,可能的解决方法如下所示:

@Component
class FooConsumer {
    private final Foo foo;

    FooConsumer(MultiProvider multiProvider) {
        // MultiProvider will be autowired by spring - constructor injection
        this.foo = multiProvider.getFoo();
    }
}

答案 1 :(得分:0)

您可以简单地通过用getFoo()MultiProvider中注释@Bean方法来实现此目的

@Component
class MultiProvider {
    @Bean(destroyMethodName="cleanup")      // HERE IS THE TRICK
    public Foo getFoo();
    public Bar getBar();
}

@Component
class FooConsumer {
    FooConsumer(Foo f);
}

如果问题出在弹簧无法正确销毁这一点,则可以在cleanup注释时声明的@Bean方法内部包含逻辑

public class Foo {
    public void cleanup() {
        // destruction logic
    }
}    

  

请注意,@component和@configurable在以下方面大致相同   一些细微的差异,但如果您不这样做,可以使用@component   要更改它。 More Info

答案 2 :(得分:0)

您可以将它们包含在Configuration中。

@Configuration
class MyConfig {
    @Bean
    public MultiProvider getMP() {
        return new MultiProvider() ;
   }
   @Bean
   public Foo getFoo() {
        return getMP(). getFoo();
   } 
}

不确定是否违反您的“不是Bean本身”规则。