Бесплатный курс по Java: от основ до продвинутого уровня
Конфигурация 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:
Как видим, бины были успешно созданы и мы ими успешно воспользовались.
Изучите аннотацию @RequestMapping в Spring MVC: как создавать несколько контроллеров с одинаковыми путями и управлять маршрутизацией запросов между ними. Примеры кода и объяснения.