Сделайте член боба доступным для автопроводки - PullRequest
0 голосов
/ 10 ноября 2018
@Component
class MultiProvider {
    public Foo getFoo();
    public Bar getBar();
}

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

Можно ли автоматически подключить MultiProvider.getFoo() в конструктор FooConsumer ..

  • без превращения Foo в бин (например, потому что Spring не должен его уничтожать, поскольку это MultiProvider ответственность)
  • и без введения зависимости от FooConsumer до MultiProvider (или любого другого класса)?

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018

Этого можно добиться, просто пометив метод 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, если вы этого не сделаете хочу изменить это. Подробнее

0 голосов
/ 11 ноября 2018

Вы можете включить их в свой Configuration.

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

Не уверен, что это нарушает ваше правило «не Бин».

0 голосов
/ 10 ноября 2018

Spring может только автоматически объявить bean-компоненты, возможный обходной путь может быть что-то вроде следующего:

@Component
class FooConsumer {
    private final Foo foo;

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