代码之家  ›  专栏  ›  技术社区  ›  Bart van Heukelom

使bean的成员可用于自动关联

  •  2
  • Bart van Heukelom  · 技术社区  · 7 年前
    @Component
    class MultiProvider {
        public Foo getFoo();
        public Bar getBar();
    }
    
    @Component
    class FooConsumer {
        FooConsumer(Foo f);
    }
    

    能给我一些吗 MultiProvider.getFoo() 自动连接到 FooConsumer 建造师。。

    • 不做 Foo bean本身(例如,因为Spring不应该破坏它,因为这是 MultiProvider
    • 并且不引入来自 到 多供应商 (或任何其他类别)?
    3 回复  |  直到 7 年前
        1
  •  0
  •   MohammadReza Alagheband    7 年前

    您可以通过简单的注释来实现这一点 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);
    }
    

    如果问题源于spring不能正确地破坏它,那么您可以将逻辑包含在内 cleanup 方法在注释时声明 @豆子

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

    请注意,@component和@configurable与 有些细微的差别,但在您的情况下,如果不这样做,您可以使用@component 我想改变它。 More Info

        2
  •  0
  •   Tom    7 年前

    @Component
    class FooConsumer {
        private final Foo foo;
    
        FooConsumer(MultiProvider multiProvider) {
            // MultiProvider will be autowired by spring - constructor injection
            this.foo = multiProvider.getFoo();
        }
    }
    
        3
  •  0
  •   daniu    7 年前

    您可以将它们包含在您的 Configuration

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

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