Создайте бин унаследованных классов без изменений и без конфигурации XML - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть некоторый существующий класс помощника без аннотации бина и без конфигурации xml.Я хочу создавать bean-компоненты для тех же классов без изменений (без добавления аннотаций) и без дополнительной настройки в xml.Является ли это возможным?

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Вы можете вызвать один @Bean метод из другого, используя @Configuration, и получить полностью инициализированный экземпляр следующим образом:

public class Foo {
    @Value("Hello, world!")
    public String value;
}

@Configuration
public class Config {
    @Bean
    public Foo createFoo() {
        Foo foo = new Foo();
        System.out.println(foo.value); // Prints null - foo not initialized yet
        return foo;
    }

    @Bean
    public Bar createBar() {
        Foo foo = createFoo();
        System.out.println(foo.value); // Prints Hello, world! - foo have been initialized by the interceptor
        return new Bar(foo);
    }
}
0 голосов
/ 12 февраля 2019

Другой вариант - использовать BeanDefinitionRegistryPostProcessor и зарегистрировать ваши классы вручную.

@Configuration
@ConditionalOnClass({
    LegacyBeansAutoConfiguration.Legacy1.class,
    LegacyBeansAutoConfiguration.Legacy2.class,
    LegacyBeansAutoConfiguration.Legacy3.class
})
@EnableAutoConfiguration(exclude = LiquibaseAutoConfiguration.class)
public class LegacyBeansAutoConfiguration implements 
  BeanDefinitionRegistryPostProcessor {

  @Override
  public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
    RootBeanDefinition beanDefinition1 = new RootBeanDefinition(Legacy1.class, Legacy1::new);
    beanDefinitionRegistry.registerBeanDefinition(Legacy1.class.getName(), beanDefinition1);

    RootBeanDefinition beanDefinition2 = new RootBeanDefinition(Legacy2.class, Legacy2::new);
    beanDefinitionRegistry.registerBeanDefinition(Legacy2.class.getName(), beanDefinition2);

    RootBeanDefinition beanDefinition3 = new RootBeanDefinition(Legacy3.class, Legacy3::new);
    beanDefinitionRegistry.registerBeanDefinition(Legacy3.class.getName(), beanDefinition3);
}

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
    // n00p
}

class Legacy1 {

}

class Legacy2 {

}

class Legacy3 {

  }
}

Вот тест, подтверждающий, что бобы зарегистрированы:

@RunWith(SpringRunner.class)
@SpringBootTest
public class LegacyBeansAutoConfigurationTest {
  @Autowired
  ApplicationContext context;

@Test
public void contextLoads() {
    Assertions.assertThat(context.getBeanNamesForType(LegacyBeansAutoConfiguration.Legacy1.class)).isNotNull();
    Assertions.assertThat(context.getBeanNamesForType(LegacyBeansAutoConfiguration.Legacy2.class)).isNotNull();
    Assertions.assertThat(context.getBeanNamesForType(LegacyBeansAutoConfiguration.Legacy3.class)).isNotNull();
}
}
0 голосов
/ 12 февраля 2019

Да, это возможно и довольно просто.Вам нужно создать свой собственный класс и аннотировать его с помощью @Configuration, а затем создать метод с аннотацией @Bean, возвращающий ваш вспомогательный класс.Примерно так:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfigClass {

    @Bean
    public HelperClass helperClassName() {
        return new HelperClass();
    }

}
...