创建遗留类的Bean,无需修改且无需xml配置

时间:2019-02-12 06:17:17

标签: java spring spring-boot annotations data-annotations

我有一些现有的旧式帮助程序类,没有Bean注释和xml配置。 我想为相同的类创建bean,而无需修改(不添加注释),并且在xml中没有任何额外的配置。 可能吗?

3 个答案:

答案 0 :(得分:5)

是的,这是可能的,而且非常简单。您需要创建自己的类并用@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();
    }

}

答案 1 :(得分:1)

您可以使用@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);
    }
}

答案 2 :(得分:1)

另一种选择是使用undefined并手动注册您的课程。

BeanDefinitionRegistryPostProcessor

在这里进行测试以确认已注册bean:

@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 {

  }
}