Можно ли создать глобальный класс для конфигурации ApplicationContxt в Spring?

118
24 октября 2019, 00:00

Подскажите можно ли создать глобальный класс конфигурации для ApplicationContext в Spring вместо того что бы использовать вот такой вот пример:

ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
Company company = (Company) context.getBean("company");

И если можно то как это можно получать потом в приложении вместо .getBean();?

Answer 1

Если вы пытаетесь получить бин таким образом, до в 99 процентах это свидетельствует о том, что Вы неправильно подходите к использованию спринга. Используя спринг, логика Вашего приложения, не должна выходить за пределы бинов. Рассмотрим для примера классическое приложение,содержащее 3 основных класса/интерфейса.

@Controller 
public class CustomWebController {
@Autowired
private CustomService customService;
}
@Service 
public class CustomService {
@Autowired
private CustomRepository customRepository;
}
@Repository
public interface CustomRepository extends JpaRepository<CustomModel, Long>{
}

У нас есть веб-контроллер (CustomRepository - для обработки запросов), сервис (CustomService - наша бизнес-логика), репозиторий(CustomRepository - опреации с БД). Все это бины, поскольку помечены соответсвующими аннотациями. Поэтому спринг при запуске приложения по умолчанию создаст из них объекты (все синглтоны) и поместит в свой контейнер. Теперь, когда на Ваш контроллер поступит запрос, поскольку контроллер является бином, вы можете объявить переменную типа класса сервисного уровня , которую спринг сможет инициализировать, используя контейнер (поместит в нее заранее созданный соответсвующий ,бин-синглтон CustomService). Для этого вы можете использовать конструктор, аннотацию autowired (как в примере) и т.д. (это уже к вопросу о способах инициализации). Как Вы можете заметить, в классе CustomService объявлена переменная типа CustomRepository, над которой имеется аннотация Autowired. Поэтому спринг проинициализирует и эту переменную, поместив в не экземпляр CustomRepository. Вместе с тем, если в классе-контроллере вы вместо того, чтобы проинциализировать переменную с помощью аннотации Autowired, создадите экземпляр класса CustomService с помощью оператора new (CustomService customService = new CustomService();), то переменная CustomRepository в экземпляре данного класса не будет проинциализирована спрингом. Это происходит потому, что экземпляр класса получен через new, а не из контейнера спринга, соответсвенно, спринг ничего не знает об этом конкретном экземпляре класса и не сможет проинициализировать переменные в нем. Это случай, когда Ваша логика вышла за пределы спринга и теперь Вам требуется конструкция, которая напаисана в Вашем вопросе. Именно поэтому это и некорректно. И еще, создавайте спринг-приложение с помощью этого сайта https://start.spring.io/ (либо через спец меню в среде разработки). Вы увидите , что спринг записывает в методе main, чтобы инициализировать приложение. Надеюсь, что это прояснит ситуацию, а если нет, то задавайте вопросы.

READ ALSO
Как работает наследование Java

Как работает наследование Java

Не могу понять почему не работает базовый методСоздал абстрактный класс Rodent для задачи интерфейса

160
Помощь с Java Servlets Jsp

Помощь с Java Servlets Jsp

я новичок, ещё не разобрался с сервлетамиВ общем, на странице index

114
Gulp Watch не следит за файлами

Gulp Watch не следит за файлами

При старте gulp watch выдает :

135