Конфигурация Spring бинов с помощью аннотаций
Last updated: 10 мая 2025 г.Как уже было упомянуто в конце прошлого урока, бины можно создавать не в applicationContext.xml, а аннотациями
прямо в классах бинов.
Благодаря этому можно не писать огромное количество xml кода.
Можно создать вот такие бины, вот таким образом с помощью xml:
1<bean id="someAdminBean"
2 class="com.someclasses.Administrator">
3</bean>
4
5<bean id="serverPCBean"
6 class="com.someclasses.ServerPC" scope="singleton"
7 init-method="someInicializationsMethod"
8 destroy-method="someCleaningsMethod">
9 <constructor-arg ref="someAdminBean"/>
10</bean>
Идентичный бин класса ServerPC можно сконфигурировать с помощью аннотаций сразу в классе бина:
1package com.someclasses;
2import org.springframework.stereotype.Component;
3import org.springframework.beans.factory.annotation.Autowired;
4import org.springframework.beans.factory.annotation.Value;
5import org.springframework.context.annotation.Scope;
6import org.springframework.beans.factory.annotation.Qualifier;
7import javax.annotation.PostConstruct;
8import javax.annotation.PreDestroy;
9
10//С помощью Component помечаем что
11//на основе этого класса будет создан бин.
12//В скобочках указываем id бина.
13@Component("serverPCBean")
14//эго Scope только аннотацей
15@Scope("singleton")
16public class ServerPC{
17 private Administrator admin;
18 //С помощью Value записывается
19 //значение в поле бина.
20 //Здесь из файла pc.propreites в String поле
21 @Value("${pcid}")
22 private String pcid;
23 @Value("Acer")
24 private String pcBrand;
25
26 ServerPC() {}
27
28 //С помощью Autowired происходит DI.
29 //Spring ищет в папке someclasses
30 //класс Administrator (класс Administrator
31 //и ServerPC лежат в папке classes/com/someclasses,
32 //можно увидеть сверху package com.someclasses;)
33 //который тоже помечен аннотацией Component
34 //и потом создает бин класса Administrator
35 //и внедряет его в текущий бин serverPCBean.
36 @Autowired
37 public ServerPC(Administrator admin) {
38 this.admin = admin;
39 }
40
41 //Это внедрение с помощью сеттера.
42 //Кстати @Autowired можно
43 //применить не только на сеттер,
44 //а вообще на метод с любым именем
45 //в этом классе который внедряет зависимость.
46 @Autowired
47 public void setAdmin(Administrator admin) {
48 this.admin = admin;
49 }
50
51 public Administrator getAdmin() {
52 return admin;
53 }
54
55 public void setPcid(String pcid) {
56 this.pcid = pcid;
57 }
58
59 public void setPCBrand(String pcBrand) {
60 this.pcBrand = pcBrand;
61 }
62
63 public String getPCid() {
64 return pcid;
65 }
66
67 public String getPCBrand() {
68 return pcBrand;
69 }
70
71 public void typeOfPC() {
72 System.out.println("Its server PC!");
73 }
74
75 public void getAdminMessage() {
76 admin.adminMessage();
77 }
78
79 //Помечаем метод инициализации
80 //(как в xml init-method)
81 @PostConstruct
82 public String someInitializationsMethod() {
83 return "Some initializations";
84 }
85
86 //Помечаем метод который выполняется при
87 //уничтожении бина (как в xml destroy-method)
88 @PreDestroy
89 public String someCleaningMethod() {
90 return "Some clean up";
91 }
92}
Также в классе администратор тоже пишем аннотацию Component
, чтобы создался бин на основе этого класса и внедрился в бин ПК:
1package com.someclasses;
2
3import org.springframework.stereotype.Component;
4
5@Component()
6public class Administrator{
7 public String adminMessage(){
8 return "I’m an administrator!";
9 }
10}
В файле же applicationContext.xml нам нужно указать где находятся файлики классов, которые мы только что создали, чтобы BeanFactory
нашел их и создал на основе этих файлов с аннотациями бины.
applicationContext.xml:
1<?xml version="1.0" encoding="UTF-8"?>
2<beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xsi:schemaLocation="http://www.springframework.org/schema/beans
6 http://www.springframework.org/schema/beans/spring-beans.xsd
7 http://www.springframework.org/schema/context
8 http://www.springframework.org/schema/context/spring-context.xsd">
9
10<!-- здесь определяем папку, которую BeanFactory
11будет анализировать на наличие аннотаций. -->
12 <context:component-scan base-package="com.someclasses"/>
13 <context:property-placeholder location="classpath:pc.properties"/>
14</beans>
Давайте же проверим создадутся ли бины в сервлете.
Пример программы:
1import javax.servlet.*;
2import javax.servlet.http.*;
3import javax.servlet.ServletException;
4import javax.servlet.annotation.WebServlet;
5import java.io.*;
6import org.springframework.context.support.ClassPathXmlApplicationContext;
7import com.someclasses.ServerPC;
8
9@WebServlet("/springservlet")
10public class SpringServlet extends HttpServlet{
11 protected void doGet(HttpServletRequest req,
12 HttpServletResponse resp)
13 throws ServletException, IOException {
14 //Объект Beanfactory
15 //анализирует applicationContext.xml,
16 //видит что там указано что нужно искать
17 //классы с аннотациями в папке com/someclasses,
18 //объект Beanfactory анализирует эту папку
19 //и создает на основе этих классов бины.
20 ClassPathXmlApplicationContext context =
21 new ClassPathXmlApplicationContext(
22 "applicationContext.xml");
23
24 //Достаем бин из context
25 ServerPC serverpcSingleton =
26 context.getBean(
27 "serverPCBean",ServerPC.class);
28 //используем бин
29 serverpcSingleton.setPcId("12353425");
30 resp.getWriter().write(serverpcSingleton.getPcId());
31 }
32}
Проверка работы приложения
Компилируем Java файлики с использованием jar файлов спринг:

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

Как видим, быны были успешно созданы и мы ими успешно воспользовались.
При всех плюсах такого подхода конфигурации бинов, ясное дело, у такого подхода есть маленький минус, что много бинов на основе одного и того же класса аннотациями не определишь, поэтому если нам нужно создать еще один бин с другим id на основе класса ServerPC, то нужно определять его в applicationContext.
Следующие уроки
Аннотация @Autowired в Spring Framework
12
мин.
Конфигурация Spring бинов с помощью java класса.
14
мин.
Создание веб-приложения в Eclipse IDE
20
мин.