Функциональные бины - это новая функция Spring 5, которая больше ориентирована на регистрацию функций в качестве поставщиков бинов. Если вам нужна только конфигурация на основе кода, вам не нужно идти туда, но вы можете использовать стандартную конфигурацию на основе аннотаций Spring.
Обычная, стандартная Spring javaconfig
Тривиальный пример, класс конфигурации:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ApplicationConfiguration {
@Bean
public DemoManager helloWorld()
{
return new DemoManagerImpl();
}
}
Основной класс:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Это будет использовать компонентное сканирование, чтобы найти ваш класс конфигурации, а затем вызвать его методы для получения bean-компонентов. Вы можете предоставить классы конфигурации, которые вы хотите в качестве аргументов, и SpringBootTest, который вы упомянули, также поддерживает это.
Таким образом, при тестировании вы можете использовать свою собственную тестовую конфигурацию, чтобы настроить загружаемые компоненты и предоставить дополнительные компоненты. Если класс конфигурации является вложенным классом, вам даже не нужно указывать его:
@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringBootDemoApplicationTests
{
@Test
public void testSomething() {
// ...
}
@TestConfiguration
static class MyTestConfiguration {
//tests specific beans
@Bean
DataSource createDataSource(){
//
}
}
}
Использование @TestConfiguration
добавит в вашу конфигурацию - если вы не хотите добавлять, а вместо этого заменять конфигурациюв общем, используйте @SpringBootTest(classes = YourCustomConfiguration.class)
.
Альтернатива: вручную созданный контекст приложения, с пружиной javaconfig
Если вы не хотите использовать javaconfig или компонентное сканирование, но вместо этого хотите также зарегистрировать свои классы конфигурации«Вы сами», вы можете сделать это, например, иметь такой метод main в main классе:
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationConfiguration.class);
HelloWorld helloWorld = ctx.getBean(HelloWorld.class);
helloWorld.setMessage("Hello World!");
helloWorld.getMessage();
}
он обычно не используется, но и не ошибается.
Альтернатива 2: ручной контекст приложения, ручная регистрация bean-компонентов
Если вы действительно хотите избежать и класса конфигурации, вы также можете сделать это следующим образом:
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SomeClass {
public static void main(String args[]) {
// first, we create empty context ourselves
ConfigurableApplicationContext ctx = new AnnotationConfigApplicationContext();
// then we get its bean factory to be able to register stuff
ConfigurableListableBeanFactory beanFactory = ctx.getBeanFactory();
// register our bean
YourBean beanToRegister = new YourBean();
beanFactory.registerSingleton(beanToRegister.getClass().getCanonicalName(), beanToRegister);
ctx.refresh(); // context refresh actually updates the status
// here we can test a bean was actually created and working
YourBean helloWorld = ctx.getBean(YourBean.class);
helloWorld.setAuthor("Hello World!");
System.out.println(helloWorld.getAuthor());
}
}
как и в случае другой альтернативы, это не такобщий подход с Spring, но это не так.