Конфигурация Spring бинов с помощью Java класса.

Иногда удобнее бывает конфигурировать бины не с помощью XML, а с помощью Java кода. То есть теперь вместо applicationContext.xml у нас будет Java класс.

Для начала давайте поправим класс ServerPC. Вернем в него конструктор, так как он будет использован в новом конфигурационном файле.

Класс ServerPC:

package com.someclasses; import org.springframework.stereotype.Component; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Scope; import org.springframework.beans.factory.annotation.PostConstruct; import org.springframework.beans.factory.annotation.PreDestroy; @Component(“serverPCBean”) @Scope(“singleton”) public class ServerPC{ @Autowired private Administrator admin; @Value(“${pcid}”) private String pcid; @Value(“Acer”) private String pcBrand; ServerPC() {} //Для начала давайте вернем конструктор, который //внедряет зависимость в бин класса ServerPC. //Он будет использоваться в Java классе конфигураций //для внедрения зависимости админа в бин ServerPC. public ServerPC(Administrator admin) { this.admin = admin; } public Administrator getAdmin() { return admin; } public void setPCid(String pcid) { this.pcid = pcid; } public void setPCBrand(String pcBrand) { this.pcBrand = pcBrand; } public String getPCid() { return pcid; } public String getPCBrand() { return pcBrand; } public void typeOfPC() { System.out.println(“Its server PC!”); } public void getAdminMessage(){ admin.adminMessage(); } @PostConstruct public String someInicializationsMethod() { return “Some inicializations”; } @PreDestroy public String someCleaningsMethod() { return “Some clean up”; } }

Конфигурационный Java класс:

import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.PropertySource; import com.someclasses.Administrator; import com.someclasses.ServerPC; //Для этого помечаем класс //конфигураций аннотацией configuration @Configuration //@ComponentScan это то же самое что // в XML //для сканирования папки с классами с аннотациями. @ComponentScan(“com.someclasses”) //@PropertySource это то же самое что // в XML. //То есть указываем файл из которого можем извлекать //значения для внедрения их в поля бинов. @PropertySource(“classpath:pc.properties”) public class ConfigClass { //теперь определим бины как в xml только java кодом. //Аннотация @Bean определяет что нижний //метод это определение бина. @Bean //имя метода то есть someUser – это id как в xml. //Возвращаемое значение это класс на основе //которого будет создаваться бин. public Administrator admin(){ //Метод создает бин и возвращает его. return new Administrator(); //BeanFactory когда будет читать этот файл вызовет //этот метод, этот метод как видим создает и возвращает //новый объект Administrator то есть бин и этот созданный //бин будет хранится в объекте BeanFactory, который //можно будет оттуда извлечь. } @Bean public ServerPC serverPC(){ //Для внедрения бина Administrator в другой бин //его нужно для начала создать. //Для этого можно вызывать ранее //определенный метод admin(), который возвращает //бин класса Administrator и передать этот бин //в конструктор нового бина класса ServerPC. //Таким образом с помощью метода serverPC() //BeanFactory создает новый бин класса ServerPC //с внедренной зависимостью. return new ServerPC(admin()); } }

Теперь создадим класс сервлета, в котором бины будут создаваться на основе конфигурационного Java класса.

import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import java.io.*; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import com.someclasses.ServerPC; @WebServlet(“/springservlet”) public class SpringServlet extends HttpServlet{ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //Для создания объекта BeanFactory на основе //Java конфигураций используется уже другая //реализация BeanFactory. //Теперь вместо ClassPathXmlApplicationContext //будет объект AnnotationConfigApplicationContext. AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( ConfigClass.class); //Достаем бин serverPC, который мы определили //в ConfigClass из context. ServerPC serverpcSingleton = context.getBean( “serverPC”,ServerPC.class); //используем бин serverpcSingleton.setPCid(“12353425”); resp.getWriter().write(serverpcSingleton.getPCid()); } }

Проверка работы приложения

Компилируем Java файлики включая новый класс с конфигурациями с использованием jar файлов спринг:

Запускаем Tomcat и открываем страницу сервлета по пути /springservlet:

Как видим, бины были успешно созданы и мы ими успешно воспользовались.

Создание веб-приложения в Eclipse IDE

Пошаговое руководство по созданию веб-приложения в Eclipse IDE: настройка проекта, добавление Tomcat сервера и подготовка к работе с Spring MVC. Подробные инструкции с скриншотами.
Time to read: 20

Основы Spring MVC. Как работает DispatcherServlet

Разберитесь с принципами Spring MVC: роль DispatcherServlet как Front Controller, настройка web.xml и applicationContext.xml. Практическое руководство с примерами кода.
Time to read: 19

Аннотация RequestMapping

Изучите аннотацию @RequestMapping в Spring MVC: как создавать несколько контроллеров с одинаковыми путями и управлять маршрутизацией запросов между ними. Примеры кода и объяснения.
Time to read: 17