Java 创建遗留类的bean,无需修改和xml配置
我有一些现有的没有bean注释和xml配置的遗留帮助器类。 我希望为相同的类创建bean,而无需修改,无需添加注释,也无需在xml中进行任何额外配置。Java 创建遗留类的bean,无需修改和xml配置,java,spring,spring-boot,annotations,data-annotations,Java,Spring,Spring Boot,Annotations,Data Annotations,我有一些现有的没有bean注释和xml配置的遗留帮助器类。 我希望为相同的类创建bean,而无需修改,无需添加注释,也无需在xml中进行任何额外配置。 可能吗 是的,这是可能的,而且非常简单。您需要创建自己的类并用@Configuration注释它,然后创建一个用@Bean注释的方法返回您的helper类。诸如此类: import org.springframework.context.annotation.Bean; import org.springframework.context.ann
可能吗 是的,这是可能的,而且非常简单。您需要创建自己的类并用@Configuration注释它,然后创建一个用@Bean注释的方法返回您的helper类。诸如此类:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfigClass {
@Bean
public HelperClass helperClassName() {
return new HelperClass();
}
}
您可以使用@Configuration从另一个@Bean方法调用一个@Bean方法,并获得一个完全初始化的实例,如下所示:
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);
}
}
另一个选项是使用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();
}
}