Ответы на вопросы на собеседование Spring Framework (часть 2).

  • Что такое жизненный цикл Spring Bean?

Жизненный цикл Spring бина - время существования класса. Spring бины инициализируются при инициализации Spring контейнера и происходит внедрение всех зависимостей. Когда контейнер уничтожается, то уничтожается и всё содержимое. Если нам необходимо задать какое-либо действие при инициализации и уничтожении бина, то нужно воспользоваться методами init() и destroy(). Для этого можно использовать аннотации @PostConstruct и @PreDestroy().
Или через xml конфигурацию:

  • Объясните работу BeanFactory в Spring.

BeanFactory - это реализация паттерна Фабрика, его функицональность покрывает создание бинов. Так как эта фабрика знает многие об объектах приложения, то она может создавать связи между объектами на этапе создания экземпляра. Существует несколько реализаций BeanFactory, самая используемся -  "org.springframework.beans.factory.xml.XmlBeanFactory". Она загружает бины на основе конфигурационного XML-файла. Чтобы создать XmlBeanFactory передайте конструктору InputStream, например:
После этой строки фабрика знает о бинах, но их экземпляры еще не созданы. Чтобы инстанцировать бин нужно вызвать метод getBean(). Например:

  • Как получить объекты ServletContext и ServletConfig внутри Spring Bean?

Доступны два способа для получения основных объектов контейнера внутри бина:
  • Реализовать один из Spring*Aware (ApplicationContextAware, ServletContextAware, ServletConfigAware и др.) интерфейсов.
  • Использовать автоматическое связывание @Autowired в спринг. Способ работает внутри контейнера спринг.

  • В чем роль ApplicationContext в Spring?

В то время, как BeanFactory используется в простых приложениях, Application Context - это более сложный контейнер. Как и BeanFactory он может быть использован для загрузки и связывания бинов, но еще он предоставляет:
  • возможность получения текстовых сообщений, в том числе поддержку интернационализации;
  • общий механизм работы с ресурсами;
  • события для бинов, которые зарегестрированы как слушатели.
Из-за большей функциональности рекомендуется использование Application Context вместо BeanFactory. Последний используется только в случаях нехватки ресурсов, например при разработке для мобильных устройств

  • Как выглядит типичная реализция метода используя Spring?

Для типичного Spring-приложения нам необходимы следующие файлы:
  • Интерфейс, описывающий функционал приложения
  • Реализация интерфейса, содержащая свойства, сэттеры-гэттеры, функции и т.п.
  • Конфигурационный XML-файл Spring'а.
  • Клиентское приложение, которое использует функцию.

  • Что такое связывание в Spring и расскажите об аннотации @Autowired?

Процесс внедрения зависимостей в бины при инициализации называется Spring Bean Wiring. Считается хорошей практикой задавать явные связи между зависимостями, но в Spring предусмотрен дополнительный механизм связывания @Autowired. Аннотация может использоваться над полем или методом для связывания по типу. Чтобы аннотация заработала, необходимо указать небольшие настройки в конфигурационном файле спринг с помощью элемента context:annotation-config.

  • Каковы различные типы автоматического связывания в Spring?

Существует четыре вида связывания в спринг:
  • autowire byName,
  • autowire byType,
  • autowire by constructor,
  • autowiring by @Autowired and @Qualifier annotations

  • Приведите пример часто используемых аннотаций Spring.

@Controller - класс фронт контроллера в проекте Spring MVC.
@RequestMapping - позволяет задать шаблон маппинга URI в методе обработчике контроллера.
@ResponseBody - позволяет отправлять Object в ответе. Обычно используется для отправки данных формата XML или JSON.
@PathVariable - задает динамический маппинг значений из URI внутри аргументов метода обработчика.
@Autowired - используется для автоматического связывания зависимостей в spring beans.
@Qualifier - используется совместно с @Autowired для уточнения данных связывания, когда возможны коллизии (например одинаковых имен\типов).
@Service - указывает что класс осуществляет сервисные функции.
@Scope - указывает scope у spring bean.
@Configuration, @ComponentScan и @Bean - для java based configurations.
AspectJ аннотации для настройки aspects и advices, @Aspect, @Before, @After,@Around, @Pointcut и др.

  • Можем ли мы послать объект как ответ метода обработчика контроллера?

Да, это возможно. Для этого используется аннотация @ResponseBody. Так можно отправлять ответы в виде JSON, XML в restful веб сервисах.

  • Является ли Spring bean потокобезопасным?

По умолчанию бин задается как синглтон в Spring. Таким образом все публичные  переменные класса могут быть изменены одновременно из разных мест. Так что - нет, не является. Однако поменяв область действия бина на request, prototype, session он станет потокобезопасным, но это скажется на производительности.

  • Как создать ApplicationContext в программе Java?

В независимой Java программе ApplicationContext можно создать следующим образом:
AnnotationConfigApplicationContext - при использовании Spring в качестве автономного приложения можно создать инициализировать контейнер с помощью аннотаций. Пример:
ClassPathXmlApplicationContext - получает информацию из xml-файла, находящегося в classpath. Пример:
FileSystemXmlApplicationContext - получает информацию из xml-файла, но с возможностью загрузки файла конфигурации из любого места файловой системы. Пример:
XmlWebApplicationContext - получает информацию из xml-файла за пределами web-приложения.

  • Можем ли мы иметь несколько файлов конфигурации Spring?

С помощью указания contextConfigLocation можно задать несколько файлов конфигурации Spring. Параметры указываются через запятую или пробел:
Поддерживается возможность указания нескольких корневых файлов конфигурации Spring:
Файл конфигурации можно импортировать:

  • Как внедрить java.util.Properties в Spring Bean?

Для возможности использования Spring EL для внедрения свойств (properties) в различные бины необходимо определить propertyConfigure bean, который будет загружать файл свойств.
Или через аннотации:

  • Как настраивается соединение с БД в Spring?

Используя datasource "org.springframework.jdbc.datasource.DriverManagerDataSource". Пример:

  • Как сконфигурировать JNDI не через datasource в applicationContext.xml?

Используя "org.springframework.jndi.JndiObjectFactoryBean". Пример

  • Каким образом можно управлять транзакциями в Spring?

Транзакциями в Spring управляют с помощью Declarative Transaction Management (программное управление). Используется аннотация @Transactional для описания необходимости управления транзакцией. В файле конфигурации нужно добавить настройку transactionManager для DataSource.

  • Каким образом Spring поддерживает DAO?

Spring DAO предоставляет возможность работы с доступом к данным с помощью технологий вроде JDBC, Hibernate в удобном виде. Существуют специальные классы: JdbcDaoSupport, HibernateDaoSupport, JdoDaoSupport, JpaDaoSupport.
Класс HibernateDaoSupport является подходящим суперклассом для Hibernate DAO. Он содержит методы для получения сессии или фабрики сессий. Самый популярный метод - getHibernateTemplate(), который возвращает HibernateTemplate. Этот темплейт оборачивает checked-исключения Hibernate в runtime-исключения, позволяя вашим DAO оставаться независимыми от исключений Hibernate.
Пример:

  • Как интегрировать Spring и Hibernate?

Для интеграции Hibernate в Spring необходимо подключить зависимости, а так же настроить файл конфигурации Spring. Т.к. настройки несколько отличаются между проектами и версиями, то смотрите официальную документацию Spring и Hibernate для уточнения настроек для конкретных технологий.

  • Как задаются файлы маппинга Hibernate в Spring?

Через applicationContext.xml в web/WEB-INF. Например:

  • Как добавить поддержку Spring в web-приложение

Достаточно просто указать ContextLoaderListener в web.xml файле приложения:

  • Можно ли использовать xyz.xml вместо applicationContext.xml?

ContextLoaderListener - это ServletContextListener, который инициализируется когда ваше web-приложение стартует. По-умолчанию оно загружает файл WEB-INF/applicationContext.xml. Вы можете изменить значение по-умолчанию, указав параметр contextConfigLocation. Пример:

Spring Framework (часть 3).

Рассказать друзьям:

1 коментарі :

  1. AnnotationConfigApplicationContext может еще читать Bean definition из Java-config
    классов? https://youtu.be/cou_qomYLNU?t=923

    ОтветитьУдалить