Бесплатный курс по Java: от основ до продвинутого уровня
Конфигурация Spring бинов с помощью аннотаций
Как уже было упомянуто в конце прошлого урока, бины можно создавать не в applicationContext.xml, а аннотациями прямо в классах бинов.
Благодаря этому можно не писать огромное количество xml кода.
Можно создать вот такие бины, вот таким образом с помощью xml:
Идентичный бин класса ServerPC можно сконфигурировать с помощью аннотаций сразу в классе бина:
package com.someclasses;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.beans.factory.annotation.Qualifier;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
//С помощью Component помечаем что
//на основе этого класса будет создан бин.
//В скобочках указываем id бина.
@Component(“serverPCBean”)
//эго Scope только аннотацей
@Scope(“singleton”)
public class ServerPC{
private Administrator admin;
//С помощью Value записывается
//значение в поле бина.
//Здесь из файла pc.propreites в String поле
@Value(“${pcid}”)
private String pcid;
@Value(“Acer”)
private String pcBrand;
ServerPC() {}
//С помощью Autowired происходит DI.
//Spring ищет в папке someclasses
//класс Administrator (класс Administrator
//и ServerPC лежат в папке classes/com/someclasses,
//можно увидеть сверху package com.someclasses;)
//который тоже помечен аннотацией Component
//и потом создает бин класса Administrator
//и внедряет его в текущий бин serverPCBean.
@Autowired
public ServerPC(Administrator admin) {
this.admin = admin;
}
//Это внедрение с помощью сеттера.
//Кстати @Autowired можно
//применить не только на сеттер,
//а вообще на метод с любым именем
//в этом классе который внедряет зависимость.
@Autowired
public void setAdmin(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();
}
//Помечаем метод инициализации
//(как в xml init-method)
@PostConstruct
public String someInitializationsMethod() {
return “Some initializations”;
}
//Помечаем метод который выполняется при
//уничтожении бина (как в xml destroy-method)
@PreDestroy
public String someCleaningMethod() {
return “Some clean up”;
}
}
Также в классе администратор тоже пишем аннотацию Component, чтобы создался бин на основе этого класса и внедрился в бин ПК:
package com.someclasses;
import org.springframework.stereotype.Component;
@Component()
public class Administrator{
public String adminMessage(){
return “I’m an administrator!”;
}
}
В файле же applicationContext.xml нам нужно указать где находятся файлики классов, которые мы только что создали,чтобы BeanFactory нашел их и создал на основе этих файлов с аннотациями бины.
applicationContext.xml:
Давайте же проверим создадутся ли бины в сервлете.
Пример программы:
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import java.io.*;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.someclasses.ServerPC;
@WebServlet(“/springservlet”)
public class SpringServlet extends HttpServlet{
protected void doGet(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, IOException {
//Объект Beanfactory
//анализирует applicationContext.xml,
//видит что там указано что нужно искать
//классы с аннотациями в папке com/someclasses,
//объект Beanfactory анализирует эту папку
//и создает на основе этих классов бины.
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext(
“applicationContext.xml”);
//Достаем бин из context
ServerPC serverpcSingleton =
context.getBean(
“serverPCBean”,ServerPC.class);
//используем бин
serverpcSingleton.setPcId(“12353425”);
resp.getWriter().write(serverpcSingleton.getPcId());
}
}
Проверка работы приложения
Компилируем Java файлики с использованием jar файлов спринг:
Запускаем Tomcat и открываем страницу сервлета по пути /springservlet:
Как видим, быны были успешно созданы и мы ими успешно воспользовались.
При всех плюсах такого подхода конфигурации бинов, ясное дело, у такого подхода есть маленький минус, что много бинов на основе одного и того же класса аннотациями не определишь, поэтому если нам нужно создать еще один бин с другим id на основе класса ServerPC, то нужно определять его в applicationContext.
Изучите мощь аннотации @Autowired в Spring - внедрение зависимостей без конструкторов и сеттеров. Практический гайд по автоматическому связыванию компонентов.
Time to read: 12
Конфигурация Spring бинов с помощью java класса.
Настройка Spring бинов через Java класс вместо XML. Практическое руководство по конфигурации с @Configuration, @Bean и внедрению зависимостей в Spring Framework.