SpringCore. Могу ли я использовать @ContextConfiguration для загрузки компонентов в основном классе вместо создания объекта ApplicationContext для загрузки компонентов?

Я прочитал это заявление в Spring doc

@ContextConfiguration определяет метаданные на уровне класса, которые используются для определения того, как загружать и настраивать ApplicationContext для интеграционных тестов.
В частности, @ContextConfiguration объявляет расположения ресурсов контекста приложения или аннотированные классы, которые будут использоваться для загрузки контекста.

Затем я пытаюсь загрузить контекст приложения в основном классе (не в тестовом классе), помещая @ContextConfiguration вверху класса, однако Spring не может загрузить определение компонента.

AppJavaBasedConfig

@Configuration
public class AppJavaBasedConfig {

    @Bean
    public IStringUtil stringUtil() {
        return new StringUtil();
    }

    @Bean
    public App app() {
        return new App();
    }
}

Главная

@ContextConfiguration(classes=AppJavaBasedConfig.class)
public class App {

    @Autowired
    private IStringUtil stringUtil;

    public static void main(String[] args) {
        // ApplicationContext context = new AnnotationConfigApplicationContext(AppJavaBasedConfig.class);
        // App app = context.getBean(App.class);
        App app = new App();
        app.stringUtil.lower("AAA");
    }
}

Он выдает исключение NullPointerException.

Итак, можем ли мы использовать эту аннотацию в основном классе?


person doannx    schedule 11.02.2017    source источник
comment
@ContextConfiguration предназначен для загрузки контекста в интеграционном тесте. вы не должны использовать его нигде, кроме стереотипных аннотаций   -  person Barath    schedule 11.02.2017


Ответы (2)


короткий ответ нет. это концептуальная проблема. Spring может загружать все bean-компоненты, аннотированные @Configuration; но кто будет создавать/запускать пружинный контейнер?

поскольку у вас есть public static void main, я предполагаю, что конечным продуктом является jar, который будет запускаться в командной строке как java -jar.

когда вы пытаетесь выполнить java -jar, выполняется метод public static void main (при условии, что у вас есть все манифесты правильно), и первое, что вы должны сделать, это создать экземпляр контейнера spring crtl+c из вашего вопроса

public static void main(String[] args) {
     ApplicationContext context = new AnnotationConfigApplicationContext(AppJavaBasedConfig.class);
     App app = context.getBean(App.class);

}

если вы не хотите делать все это, вы можете использовать spring boot

person harry    schedule 11.02.2017

Если вам нужен IStringUtil stringUtil в App.java и что-то протестировать, вы можете использовать атрибут @PostContruct или init-method @Bean для вызова во время жизненного цикла компонента:

@Component
public class App {

    @Autowired
    private IStringUtil stringUtil;

    @PostConstruct
    public void init() {

        stringUtil.lower("AAA");
    }
}
person Barath    schedule 11.02.2017
comment
Спасибо за ваш быстрый представитель, однако [тестировать что-то] не моя цель, я действительно хочу загрузить определения компонентов. Кстати, возможно, ваш последний комментарий о функции этой аннотации следует учитывать в этом случае. - person doannx; 11.02.2017