Конфигурация 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:

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

Search Icon

При всех плюсах такого подхода конфигурации бинов, ясное дело, у такого подхода есть маленький минус, что много бинов на основе одного и того же класса аннотациями не определишь, поэтому если нам нужно создать еще один бин с другим id на основе класса ServerPC, то нужно определять его в applicationContext.

Аннотация @Autowired в Spring Framework

Изучите мощь аннотации @Autowired в Spring - внедрение зависимостей без конструкторов и сеттеров. Практический гайд по автоматическому связыванию компонентов.
Time to read: 12

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

Настройка Spring бинов через Java класс вместо XML. Практическое руководство по конфигурации с @Configuration, @Bean и внедрению зависимостей в Spring Framework.
Time to read: 14

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

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