Как реализуется настройка приложения через java config
Перейти к содержимому

Как реализуется настройка приложения через java config

  • автор:

Конфигурация Spring MVC

Конфигурация MVC на Java и пространство имен MVC на XML предусматривают конфигурацию по умолчанию, подходящую для большинства приложений, и конфигурационный API для ее настройки.

Вам не потребуется разбираться в базовых бинах, создаваемых Java-конфигурацией MVC и пространством имен MVC.

Активация конфигурации MVC

В Java-конфигурации можно использовать аннотацию @EnableWebMvc для активации конфигурации MVC, как показано в следующем примере:

@Configuration @EnableWebMvc public class WebConfig
@Configuration @EnableWebMvc class WebConfig

В XML-конфигурации можно использовать элемент для активации конфигурации MVC, как показано в следующем примере:

В следующем примере регистрируется ряд инфраструктурных бинов Spring MVC и подстраивается под зависимости, доступные в classpath (например, преобразователи полезных данных для JSON, XML и др.).

API конфигурации MVC

В Java-конфигурации можно реализовать интерфейс WebMvcConfigurer , как показано в следующем примере:

@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer < // Реализовываем методы конфигурации. >
@Configuration @EnableWebMvc class WebConfig : WebMvcConfigurer < // Реализовываем методы конфигурации. >

В XML можно проверять атрибуты и подэлементы . Можно просмотреть XML-схему Spring MVC или использовать функцию автодополнения кода в вашей IDE, чтобы узнать, какие атрибуты и подэлементы доступны.

Преобразование типа

По умолчанию установлены форматировщики для различных типов чисел и дат наряду со средствами поддержки настройки через @NumberFormat и @DateTimeFormat для полей.

Чтобы зарегистрировать кастомные форматировщики и преобразователи в конфигурации Java, используйте следующее:

@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer < @Override public void addFormatters(FormatterRegistry registry) < // . >>
@Configuration @EnableWebMvc class WebConfig : WebMvcConfigurer < override fun addFormatters(registry: FormatterRegistry) < // . >>

Чтобы сделать то же самое в XML-конфигурации, используйте следующее:

По умолчанию Spring MVC учитывает региональные настройки запроса при парсинге и форматировании значений даты. Это справедливо для форм, где даты представлены в виде строк с полями формы «input». Однако для полей формы «date» и «time» браузеры используют фиксированный формат, определенный в спецификации HTML. Для таких случаев форматирование даты и времени можно настроить следующим образом:

@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer < @Override public void addFormatters(FormatterRegistry registry) < DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar(); registrar.setUseIsoFormat(true); registrar.registerFormatters(registry); >>
@Configuration @EnableWebMvc class WebConfig : WebMvcConfigurer < override fun addFormatters(registry: FormatterRegistry) < val registrar = DateTimeFormatterRegistrar() registrar.setUseIsoFormat(true) registrar.registerFormatters(registry) >>

Валидация

По умолчанию, если в classpath присутствует Bean Validation (например, Hibernate Validator), LocalValidatorFactoryBean регистрируется как глобальный валидатор для использования с аннотацией @Valid и свойства Validated на аргументах методов контроллера.

В конфигурации Java можно настроить глобальный экземпляр Validator , как показано в следующем примере:

@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer < @Override public Validator getValidator() < // . >>
@Configuration @EnableWebMvc class WebConfig : WebMvcConfigurer < override fun getValidator(): Validator < // . >>

В следующем примере показано, как получить такую же конфигурацию на XML:

Обратите внимание, что также можно регистрировать реализации Validator локально, как показано в следующем примере:

@Controller public class MyController < @InitBinder protected void initBinder(WebDataBinder binder) < binder.addValidators(new FooValidator()); >>
@Controller class MyController < @InitBinder protected fun initBinder(binder: WebDataBinder) < binder.addValidators(FooValidator()) >>

Если необходимо, чтобы LocalValidatorFactoryBean был куда-то внедрён, создайте бин и пометьте его аннотацией @Primary , чтобы избежать конфликта с тем, что был объявлен в конфигурации MVC.

Перехватчики

В конфигурации Java можно зарегистрировать перехватчики для применения к входящим запросам, как показано в следующем примере:

@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer < @Override public void addInterceptors(InterceptorRegistry registry) < registry.addInterceptor(new LocaleChangeInterceptor()); registry.addInterceptor(new ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**"); >>
@Configuration @EnableWebMvc class WebConfig : WebMvcConfigurer < override fun addInterceptors(registry: InterceptorRegistry) < registry.addInterceptor(LocaleChangeInterceptor()) registry.addInterceptor(ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**") >>

В следующем примере показано, как получить такую же конфигурацию на XML:

Сопоставленные перехватчики не идеально подходят для использования в качестве уровня безопасности из-за возможности возникновения несоответствия аннотированному контроллеру согласования путей, который также может прозрачно согласовывать косые черты и расширения путей, наряду с другими вариантами согласования путей. Многие из этих вариантов уже устарели, но вероятность несоответствия остается. Как правило, мы рекомендуем использовать Spring Security, который включает в себя специальный MvcRequestMatcher для согласования путей Spring MVC, а также имеет брандмауэр безопасности, который блокирует многие нежелательные символы в путях URL-адресов.

Типы содержимого

Можно сконфигурировать способ, которым Spring MVC определяет запрашиваемые типы среды передачи данных из запроса (например, заголовок Accept , расширение пути URL-адреса, параметр запроса и другие).

По умолчанию проверяемым является только заголовок Accept .

Если необходимо использовать разрешение типа содержимого на основе URL-адреса, рассмотрите возможность использования стратегии параметров запроса вместо расширений пути.

В Java-конфигурации можно настроить разрешение запрашиваемого типа содержимого, как показано в следующем примере:

@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer < @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) < configurer.mediaType("json", MediaType.APPLICATION_JSON); configurer.mediaType("xml", MediaType.APPLICATION_XML); >>
@Configuration @EnableWebMvc class WebConfig : WebMvcConfigurer < override fun configureContentNegotiation(configurer: ContentNegotiationConfigurer) < configurer.mediaType("json", MediaType.APPLICATION_JSON) configurer.mediaType("xml", MediaType.APPLICATION_XML) >>

В следующем примере показано, как получить такую же конфигурацию на XML:

    json=application/json xml=application/xml  

Преобразователи сообщений

Вы можете настроить HttpMessageConverter в Java-конфигурации, переопределив configureMessageConverters() (чтобы заменить преобразователи по умолчанию, созданные Spring MVC) или переопределив extendMessageConverters() (чтобы настроить преобразователи по умолчанию или добавить дополнительные преобразователи к преобразователям по умолчанию).

В следующем примере добавлены преобразователи XML и Jackson JSON с настроенным ObjectMapper вместо стандартных:

@Configuration @EnableWebMvc public class WebConfiguration implements WebMvcConfigurer < @Override public void configureMessageConverters(List> converters) < Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder() .indentOutput(true) .dateFormat(new SimpleDateFormat("yyyy-MM-dd")) .modulesToInstall(new ParameterNamesModule()); converters.add(new MappingJackson2HttpMessageConverter(builder.build())); converters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build())); >>
@Configuration @EnableWebMvc class WebConfiguration : WebMvcConfigurer < override fun configureMessageConverters(converters: MutableList>) < val builder = Jackson2ObjectMapperBuilder() .indentOutput(true) .dateFormat(SimpleDateFormat("yyyy-MM-dd")) .modulesToInstall(ParameterNamesModule()) converters.add(MappingJackson2HttpMessageConverter(builder.build())) converters.add(MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build()))

В предыдущем примере Jackson2ObjectMapperBuilder используется для создания общей конфигурации для MappingJackson2HttpMessageConverter и MappingJackson2XmlHttpMessageConverter с включенным отступом, настроенным форматом даты и регистрацией модуля jackson-module-parameter-names , который добавляет поддержку доступа к именам параметров (функция, добавленная в Java 8).

Это средство сборки настраивает свойства Jackson по умолчанию следующим образом:

  • DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES is disabled.
  • MapperFeature.DEFAULT_VIEW_INCLUSION is disabled.

Оно также автоматически регистрирует следующие известные модули, если они обнаружены в classpath:

  • jackson-datatype-joda: Поддержка типов Joda-Time.
  • jackson-datatype-jsr310: Поддержка типов API даты и времени Java 8.
  • jackson-datatype-jdk8: Поддержка других типов Java 8, таких как Optional .
  • jackson-module-kotlin : Поддержка классов и классов данных Kotlin.

Включение отступов с поддержкой Jackson XML требует наличия зависимости woodstox-core-asl в дополнение к jackson-dataformat-xml .

Имеются и другие любопытные модули Jackson:

  • jackson-datatype-money: Поддержка типов javax.money (неофициальный модуль).
  • jackson-datatype-hibernate: Поддержка специфических для Hibernate типов и свойств (включая аспекты отложенной загрузки).

В следующем примере показано, как получить такую же конфигурацию на XML:

Представление контроллеров

Это сокращение для определения ParameterizableViewController , который при вызове немедленно переходит к представлению. Можно использовать его в статических случаях, когда нет логики Java-контроллера, которую нужно выполнить до того, как представление сгенерирует ответ.

В следующем примере Java-конфигурации направлен запрос на / в представление под названием home :

@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer < @Override public void addViewControllers(ViewControllerRegistry registry) < registry.addViewController("/").setViewName("home"); >>
@Configuration @EnableWebMvc class WebConfig : WebMvcConfigurer < override fun addViewControllers(registry: ViewControllerRegistry) < registry.addViewController("/").setViewName("home") >>

В следующем примере получается то же самое, что и в предыдущем, но при помощи XML, путем использования элемента :

Если метод с аннотацией @RequestMapping отображен на URL-адрес для любого HTTP-метода, то контроллер представления нельзя использовать для обработки того же URL-адреса. Это связано с тем, что совпадение по URL-адресу с аннотированным контроллером считается достаточно убедительным признаком принадлежности конечной точки, поэтому клиенту может быть отправлен ответ 405 (METHOD_NOT_ALLOWED), 415 (UNSUPPORTED_MEDIA_TYPE) или аналогичный ответ для помощи в отладке. По этой причине рекомендуется избегать разделения обработки URL-адреса на аннотированный контроллер и контроллер представления.

Распознаватели представлений

Конфигурация MVC упрощает регистрацию распознавателей представлений.

В следующем примере Java-конфигурации конфигурируется разрешение представления согласования контента с использованием JSP и Jackson в качестве View по умолчанию для визуализации в формате JSON:

@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer < @Override public void configureViewResolvers(ViewResolverRegistry registry) < registry.enableContentNegotiation(new MappingJackson2JsonView()); registry.jsp(); >>
@Configuration @EnableWebMvc class WebConfig : WebMvcConfigurer < override fun configureViewResolvers(registry: ViewResolverRegistry) < registry.enableContentNegotiation(MappingJackson2JsonView()) registry.jsp() >>

В следующем примере показано, как получить такую же конфигурацию на XML:

Обратите внимание, однако, что FreeMarker, Tiles, Groovy Markup и шаблоны скриптов также требуют конфигурирования технологии представления.

Пространство имен MVC предусматривает специальные элементы. Следующий пример работает с FreeMarker:

В Java-конфигурации можно добавить соответствующий бин Configurer , как показано в следующем примере:

@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer < @Override public void configureViewResolvers(ViewResolverRegistry registry) < registry.enableContentNegotiation(new MappingJackson2JsonView()); registry.freeMarker().cache(false); >@Bean public FreeMarkerConfigurer freeMarkerConfigurer() < FreeMarkerConfigurer configurer = new FreeMarkerConfigurer(); configurer.setTemplateLoaderPath("/freemarker"); return configurer; >>
@Configuration @EnableWebMvc class WebConfig : WebMvcConfigurer < override fun configureViewResolvers(registry: ViewResolverRegistry) < registry.enableContentNegotiation(MappingJackson2JsonView()) registry.freeMarker().cache(false) >@Bean fun freeMarkerConfigurer() = FreeMarkerConfigurer().apply < setTemplateLoaderPath("/freemarker") >>

Статические ресурсы

Эта опция обеспечивает удобный способ обработки статических ресурсов из списка местоположений на основе Resource .

В следующем примере, если запрос начинается с /resources , относительный путь используется для поиска и обработки статических ресурсов относительно /public в корне веб-приложения или в classpath в /static . Ресурсы предоставляются с истечением срока действия в один год, чтобы обеспечить максимальное использование кэша браузера и сокращение HTTP-запросов, сделанных браузером. Информация Last-Modified выводится из Resource#lastModified , чтобы предоставлять поддержку условных HTTP-запросов с заголовками "Last-Modified" .

В следующем листинге показано, как это сделать с помощью Java-конфигурации:

@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer < @Override public void addResourceHandlers(ResourceHandlerRegistry registry) < registry.addResourceHandler("/resources/**") .addResourceLocations("/public", "classpath:/static/") .setCacheControl(CacheControl.maxAge(Duration.ofDays(365))); >>
@Configuration @EnableWebMvc class WebConfig : WebMvcConfigurer < override fun addResourceHandlers(registry: ResourceHandlerRegistry) < registry.addResourceHandler("/resources/**") .addResourceLocations("/public", "classpath:/static/") .setCacheControl(CacheControl.maxAge(Duration.ofDays(365))) >>

В следующем примере показано, как получить такую же конфигурацию на XML:

Обработчик ресурсов также поддерживает цепочку реализаций ResourceResolver и ResourceTransformer , которые можно использовать, чтобы создать набор инструментальных средств для работы с оптимизированными ресурсами.

Вы можете использовать VersionResourceResolver для версионированных URL-адресов ресурсов на основе хэша MD5, вычисленного из контента, фиксированной версии приложения или другого. ContentVersionStrategy (хэш MD5) является продуманным выбором – за некоторыми значительными исключениями, такими как ресурсы JavaScript, используемые с загрузчиком модулей.

В следующем примере показано, как использовать VersionResourceResolver в Java-конфигурации:

@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer < @Override public void addResourceHandlers(ResourceHandlerRegistry registry) < registry.addResourceHandler("/resources/**") .addResourceLocations("/public/") .resourceChain(true) .addResolver(new VersionResourceResolver().addContentVersionStrategy("/**")); >>
@Configuration @EnableWebMvc class WebConfig : WebMvcConfigurer < override fun addResourceHandlers(registry: ResourceHandlerRegistry) < registry.addResourceHandler("/resources/**") .addResourceLocations("/public/") .resourceChain(true) .addResolver(VersionResourceResolver().addContentVersionStrategy("/**")) >>

В следующем примере показано, как получить такую же конфигурацию на XML:

Затем можно использовать ResourceUrlProvider для перезаписи URL-адресов и применения полной цепочки распознавателей и преобразователей – например, для вставки версий. Конфигурация MVC предусматривает бин ResourceUrlProvider , который можно внедрять в другие бины. Вы также можете сделать перезапись прозрачной с помощью ResourceUrlEncodingFilter для Thymeleaf, JSP, FreeMarker и других, используя URL-теги, которые полагаются на HttpServletResponse#encodeURL .

Обратите внимание, что при использовании EncodedResourceResolver (например, для обработки закодированных ресурсов с методами сжатия gzip или brotli) и VersionResourceResolver , необходимо зарегистрировать их именно в таком порядке. Это обеспечивает надежное вычисление версий, базирующихся на содержимом, на основе некодированного файла.

WebJars также поддерживаются при помощи WebJarsResourceResolver , который автоматически регистрируется при наличии библиотеки org.webjars:webjars-locator-core в classpath. Распознаватель может переписывать URL-адреса, чтобы включить в состав версию jar, а также сопоставлять входящие URL-адреса без версий – например, из /jquery/jquery.min.js в /jquery/1.2.0/jquery.min.js .

Java-конфигурация на основе ResourceHandlerRegistry предусматривает дополнительные возможности для тонкого контроля, например, логику работы при последнем изменении и оптимизированное разрешение ресурсов.

Сервлет по умолчанию

Фреймворк Spring MVC позволяет отображать DispatcherServlet на / (тем самым переопределяя отображение стандартного сервлета контейнера), при этом статические запросы к ресурсам будут обрабатываться стандартным сервлетом контейнера. Он конфигурирует DefaultServletHttpRequestHandler с URL-отображением /** и самым низким приоритетом по отношению к другим URL-отображениям.

Этот обработчик перенаправляет все запросы на сервлет по умолчанию. Поэтому он должен оставаться последним в порядке следования всех других HandlerMappings для URL. Это происходит в случае, если используется . Кроме того, если вы создаете свой собственный экземпляр HandlerMapping , не забудьте установить его свойство order в значение меньшее, чем у DefaultServletHttpRequestHandler , которое является Integer.MAX_VALUE .

В следующем примере показано, как активировать эту функцию, используя настройки по умолчанию:

@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer < @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) < configurer.enable(); >>

Работа с БД в Spring Boot на примере postgresql

Данная статья является продолжением Spring Boot Restful Service, где была бы раскрыта тема работы с БД в Spring Boot. Давайте рассмотрим эту тему подробнее на примере СУБД postgresql, а в качестве основы возьмём проект, который мы делали в той статье.

Напомню, что проект представляет из себя простой restful-service, который принимает GET-запрос по HTTP и возвращает профиль пользователя по его id.

Создание и заполнение таблицы

Сам профиль содержит кроме id также имя, фамилию и возраст. Поэтому создадим таблицу profile в базе данных.

CREATE TABLE public.profile
(
id serial ,
first_name character varying ( 50 ) NOT NULL ,
last_name character varying ( 50 ) NOT NULL ,
age integer NOT NULL ,
CONSTRAINT profile_id_pk PRIMARY KEY (id)
);

insert into profile (first_name, last_name, age)
values ( 'Иван' , 'Петров' , 23 );

Для поля id можно использовать тип serial. Он представляет собой целое число, которое увеличивается на 1 автоматически при вставке новой записи в таблицу.

Добавляем зависимость JDBC API

Для выполнения запросов в БД нам нужно добавить в наш проект ещё две зависимости:


org.springframework.boot
spring-boot-starter-jdbc


org.postgresql
postgresql
runtime

spring-boot-starter-jdbc позволяет выполнять sql-запросы в базу, а postgresql – это драйвер для работы с соответствующей СУБД. Обратите внимание, что он имеет scope = runtime. То есть зависимость нужна только в процессе работы приложения.

Параметры подключения

Для интеграции с БД также требуется указать параметры подключения, такие как логин, пароль и т.п. Создадим файл application.yml в папке resources с примерно таким содержимым:

spring :
datasource :
driver-class-name : org.postgresql.Driver
url : jdbc:postgresql://localhost:5432/example_db
username : example_user
password : "!QAZxsw2"

Если в проекте по умолчанию был файл application.properties – удалите его.

Обратите внимание, что достаточно лишь прописать параметры подключения – и всё остальное Spring Boot сделает за вас. Например, инициализирует пул подключений.

Слой взаимодействия с БД

Для работы с БД принято выделять отдельный слой repository. Как и для сервиса из предыдущей статьи, здесь будет удобно выделить интерфейс:

public interface ProfileRepository <

Optional getProfileById( int id);
>

При поиске по id здесь мы будем возвращать Optional. То есть объект может быть в базе, а может и не быть. И в зависимости от контекста это может трактоваться и как ошибка, и как нормальное поведение. Решение о том, ошибка это или нет, будет принимать сервисный слой, который мы модифицируем далее.

Реализация record-класса Profile рассматривалась в предыдущей статье. Его единственное назначение – это отображать поля таблицы в поля класса на Java.

public record Profile(
int id,
String firstName,
String lastName,
int age
) >

@Repository
public class ProfileRepositoryImpl implements ProfileRepository

private static final String SQL_GET_PROFILE_BY_ID =
"select id, first_name, last_name, age from profile where >;

private final ProfileMapper profileMapper;
private final NamedParameterJdbcTemplate jdbcTemplate;

public ProfileRepositoryImpl(
ProfileMapper profileMapper,
NamedParameterJdbcTemplate jdbcTemplate
) this .profileMapper = profileMapper;
this .jdbcTemplate = jdbcTemplate;
>

@Override
public Optional getProfileById( int id) var params = new MapSqlParameterSource();
params.addValue( "id" , id);
return jdbcTemplate.query(
SQL_GET_PROFILE_BY_ID ,
params,
profileMapper
).stream()
.findFirst();
>
>

Обратите внимание, что ВСЕ репозитории снабжаются аннотацией @Repository, которая является частным случаем @Component. Она обеспечивает маппинг ошибок, специфичных для СУБД, в стандартные исключения JDBC.

Сам SQL-запрос для выборки профиля пользователя здесь вынесен в качестве константы в начало класса. Для подстановки целевого id используется именованный параметр с двоеточием в начале, а не простая конкатенация строки и числа. Это позволяет нам сделать запрос более устойчивым к хакерским атакам типа sql injection с одной стороны и более производительным с другой, т.к. СУБД сможет закешировать шаблон данного запроса.

NamedParameterJdbcTemplate – стандартный компонент, предоставляющий методы для взаимодействия с БД. Как видно из названия, он поддерживает именованные параметры. ProfileMapper преобразует данные, полученные из БД в объект Profile. То есть он хранит в себе логику маппинга полей таблицы на поля класса. Более подробно мы рассмотрим его чуть ниже.

Реализация нашего целевого метода getProfileById() предельно проста. Сначала подставляем требуемый id в sql-запрос через именованный параметр благодаря классу MapSqlParameterSource. Затем вызываем метод query, передавая ему сам sql-запрос, именованные параметры и маппер полей таблицы. В качестве результата получаем список объектов типа Profile.

Исходя из того, что id является первичным ключом в таблице и его значение уникально, мы можем здесь использовать преобразование в стрим и findFirst(). Такая связка более универсальна и безопасна, чем queryForObject(), который может выкинуть исключение, если найдено более одной записи.

Маппинг результатов выборки из БД

Сам ProfileMapper не хранит внутреннего состояния и всего лишь реализует интерфейс RowMapper, типизированный нашим объектом Profile.

@Component
public class ProfileMapper implements RowMapper

@Override
public Profile mapRow(ResultSet rs, int rowNum) throws SQLException return new Profile(
rs.getInt( "id" ),
rs.getString( "first_name" ),
rs.getString( "last_name" ),
rs.getInt( "age" )
);
>
>

На вход он получает ResultSet, представляющий собой результат выборки. Из этого ResultSet мы извлекаем значения полей благодаря методам getInt() и getString() по имени колонки в таблице.

Новый сервисный слой

Теперь осталось только внедрить наш ProfileDao в сервисный слой. В предыдущей статье мы уже создавали реализацию сервисного слоя ProfileServiceMock, которая является заглушкой и на самом деле ни в какую базу не ходит. Сейчас мы создадим другую реализацию того же сервиса:

@Primary
@Service
public class ProfileServiceImpl implements ProfileService

private final ProfileRepository profileRepository;

public ProfileServiceImpl(ProfileRepository profileRepository) this .profileRepository = profileRepository;
>

@Override
public Profile getProfile( int personId) return profileRepository.getProfileById(personId)
.orElseThrow(() -> new ProfileNotFoundException(personId));
>
>

Обратите внимание на аннотацию @Primary. Если её не указывать, то спринг не сможет заинжектить в ProfileController нужную нам реализацию сервиса, т.к. по факту у нас их две. Чтобы указать, что по умолчанию нам нужна именно эта реализация, мы и используем данную аннотацию. Ещё разные реализации интерфейса можно подставлять в зависимости от профиля приложения с помощью аннотации @Profile.

Как я уже говорил, именно сервисный слой находится в контексте выполнения запроса и может правильно трактовать пустой результат из репозитория. В данном случае это ошибка и здесь Optional предоставляет очень удобный метод orElseThrow(), в который мы передаём наше исключение через лямбда-выражение.

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

ProfileService, в свою очередь, вызывается из контроллера. Таким образом, вырисовывается типичная трёхслойная архитектура: контроллер (с аннотацией @Controller) -> сервис (@Service) -> dao (@Repository). Контроллер отвечает за маппинг входящих http-запросов, сервисный слой реализует бизнес-логику, а dao работает непосредственно с БД.

Теперь если вы запустите приложение и выполните GET-запрос по адресу http://localhost:8080/profiles/1, то получите профиль с >

<
"id" : 1 ,
"firstName" : "Иван" ,
"lastName" : "Петров" ,
"age" : 21
>

Если же выполнить запрос с другим id, то наш ErrorController корректно обработает исключение ProfileNotFoundException и выдаст пользователю json с описанием ошибки:

<
"message" : "Profile with not found"
>

Итоги

В результате мы добавили в наше приложение слой взаимодействия с БД, а также создали новую реализацию сервисного слоя, который вместо заглушки теперь использует репозиторий.

В следующей статье Добавление записи через POST-запрос в Spring Boot мы научимся создавать записи в БД.

Что такое Spring Framework?

Spring Framework – это платформа приложений с открытым исходным кодом, написанная на Java. Он предназначен для упрощения проектирования приложений за счет автоматической обработки низкоуровневых функций. Это позволяет разработчикам сосредоточиться на бизнес-логике. Spring также очень легко адаптируется со многими модулями, которые расширяют возможности фреймворка.

Хотя Spring не навязывает конкретную модель программирования, она приобрела широкую популярность в сообществе Java в качестве дополнения к корпоративной модели JavaBeans (EJB). Отчасти это связано с уникальным набором функций Spring, таких как инверсия управления и аспектно-ориентированное программирование (AOП), которые отлично подходят для работы с компонентами.

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

• Spring позволяет разрабатывать приложения корпоративного уровня с помощью POJOs, поэтому вам не нужен другой продукт-контейнер EJB.

• Spring предлагает согласованный, масштабируемый интерфейс управления транзакциями как для локальных транзакций, так и для глобальных транзакций.

• Spring организована по модульной схеме. Его веб-фреймворк представляет собой легкий веб-фреймворк MVC.

• Spring инновационно использует уже существующие технологии, такие как фреймворки ORM, таймеры JEE и JDK.

• С помощью Spring легко протестировать приложение.

• Spring предоставляет отличный API, поэтому легко работать с технологическими исключениями.

Большинство компаний, которым нужна экспертиза Spring Framework, - это финансовые компании, такие как банки и инвестиционные фирмы. Эти компании заинтересованы в использовании Spring для обеспечения безопасности и оптимизации своего бухгалтерского учета и продаж. Поэтому большинство вопросов для интервью будут проверять ваши знания об этих функциях, таких как внедрение зависимостей, аспектно-ориентированное программирование и MVC.

При устройстве на должность разработчика Spring, вам, безусловно, будут заданы всеобъемлющие вопросы о том, почему используется Spring и какие преимущества он предлагает. Чтобы помочь вам подготовиться, мы собрали 33 лучших вопросов для собеседования, чтобы освежить ваши знания по каждой из этих категорий.

Топ вопросов для собеседования по Spring Framework:

1. В чем преимущества Spring?

• Spring является легким в использовании ресурсов, при этом базовая структура Spring весит всего 2 МБ памяти.

• Масштабируемость: интерфейс управления транзакциями Spring может масштабироваться как до локальной транзакции в одной базе данных, так и до глобальных транзакций с помощью модуля JTA

• Обработка исключений: Обработка исключений проста благодаря многочисленным ресурсам API для обработки исключений в каждом модуле.

• Многоуровневая архитектура: Позволяет использовать нужные части программы и отказаться от остальных.

• Включено POJO: Простое старое объектное программирование на Java обеспечивает непрерывную тестируемость и интеграцию.

• С открытым исходным кодом: Бесплатно для всех и без блокировки поставщика.

• Инверсия управления (IOC): Достигается свободная связь через IOC, позволяя объектам передавать свои зависимости другим объектам, а не зависимым объектам.

• Аспектно-ориентированный (AOP): Spring поддерживает аспектно-ориентированное программирование, парадигму, которая отделяет бизнес-логику приложений от системных служб.

2. Что такое файл конфигурации для Spring?

Файл конфигурации для Spring представляет собой XML-файл, содержащий информацию о классе для проекта. Они описывают конфигурацию каждого класса, то, как они представлены другим классам, и зависимости во всей программе.

3. Каковы различные модули Spring Framework?

Всего существует около 20 модулей, которые разделены на уровни Основного контейнера, Доступа к данным/интеграции, интернета, AOP (Аспектно-ориентированное программирование), Инструментария и тестирования.

Контейнер для Core : Ядро Spring Framework содержит четыре модуля.

• SpEL (Spring Expression Language)

Доступ к данным/интеграция: Поддерживает взаимодействие с базой данных с помощью пяти модулей.

• JDBC (Подключение к базе данных Java)

• ORM (Объектно-реляционное сопоставление)

• OXM (Объектные XML-картографы)

• JMS (Служба обмена сообщениями Java)

Веб: Добавлена поддержка создания веб-приложения с использованием 4 модулей.

Аспектно-ориентированное программирование: Этот уровень позволяет отделять код с помощью функций рекомендаций и точечных вырезов.

Инструментирование: Этот уровень добавляет поддержку инструментирования классов и реализаций загрузчика классов.

Тест: Добавлена поддержка тестирования с использованием Junit и TestNG.

Разное: За пределами этих категорий слоев существуют два модуля.

• Аспекты: Позволяет Spring интегрироваться с аспектом.

• Обмен сообщениями: Добавлена поддержка STOMP, модели программирования аннотаций, и позволяет направлять сообщения STOMP от клиентов WebSocket.

4. Каковы различные компоненты приложения Spring?

Приложения Spring содержат пять компонентов:

1. Интерфейс: Определяет функции программы.

2. Класс компонента: Содержит свойства, методы настройки и получения для доступа к компоненту, а также определенные функции и т.д.

3. Spring Аспектно-ориентированное программирование (AOP): Включает в себя сквозные функциональные возможности, которые не поддерживаются в объектно-ориентированном программировании.

4. Файл конфигурации компонента: Содержит информацию о классах, способах их настройки и определяет их взаимосвязи.

5. Пользовательская программа: Вызывает функции по всей программе

5. Что такое внедрение зависимостей?

Внедрение зависимостей (DI) - это концепция, которая определяет, как должно быть связано несколько классов. Это один из примеров Инверсии контроля. Вам не нужно явно подключать службы и компоненты в коде при использовании внедрения зависимостей. Вместо этого вы описываете службы, необходимые каждому компоненту, в файле конфигурации XML и разрешаете контейнеру IOC автоматически подключать их.

6. Что такое Spring IoK контейнер?

Контейнер IoC создает, настраивает и соединяет объекты, одновременно управляя их жизненным циклом. Контейнер получает инструкции по этим областям из метаданных конфигурации, предоставленных пользователем.

7. Каковы типы IoK ?

• Контейнер BeanFactory: Этот заводской класс содержит предварительно упакованную коллекцию компонентов, которые создаются при вызове клиентами. Это самый простой контейнер для поддержки DI.

• Контейнер ApplicationContext: Построенный поверх контейнера BeanFactory, этот контейнер обеспечивает дополнительные функциональные возможности, ориентированные на предприятие. Например, контейнеры ApplicationContext предоставляют возможность разрешать текстовые сообщения и публиковать события приложения.

8. Что такое Аспектно-ориентированное программирование (AOП)?

AOП-это метод программирования, который позволяет программистам модулировать поведение, используемое в типичных подразделениях ответственности, используемых в объектно-ориентированном программировании. Основная конструкция аспектов AOП – это поведение, применимое к разным классам. Извлечение этих моделей поведения из отдельных компонентов в аспекты позволяет легко использовать их повторно.

9. Что такое Spring Bean ?

Это объекты, созданные из метаданных конфигурации при их передаче в контейнер IOC. Они составляют основу всех Spring . Контейнер IOC создает экземпляры, настраивает, подключает и управляет каждым компонентом.

10. Каковы общие реализации ApplicationContext?

Тремя наиболее популярными контейнерами являются:

1. Файловая система xmlapplicationcontext: Заставляет конструктор загружать определения компонентов из файла конфигурации XML. На него должен быть указан полный путь к файлу.

2. ClassPathXmlApplicationContext: Этот контейнер выполняет то же самое, что и выше, но не требует полного пути к файлу. Вместо этого вы устанавливаете свойство CLASSPATH и позволяете контейнеру находить XML по этому CLASSPATH .

3. WebXmlApplicationContext: Загружает все определения компонентов в веб-приложение из XML-файла.

11. В чем разница между BeanFactory и ApplicationContext?

BeanFactory – это базовый, компактный контейнер с ограниченной функциональностью. Его лучше всего использовать для простых задач или при использовании машин с низким ресурсом.

ApplicationContext – это расширенный, более интенсивный контейнер с расширенным интерфейсом и дополнительными возможностями, такими как AOP. Этот контейнер лучше всего использовать, когда вам требуется больше функциональности, чем на заводе Bean, и у вас достаточно ресурсов, доступных на машине.

12. Как вы добавляете компонент в Spring ?

Мы должны аннотировать метод: @Bean аннотация. Когда JavaConfig встретит этот метод, он выполнит этот метод и зарегистрирует возвращаемое значение в качестве компонента в BeanFactory.

public class User

private String name;
private String address;

public String getName() <
return name;
>
public void setName(String name) <
this.name = name;
>
public String getAddress() <
return address;
>
public void setAddress(String address) <
this.address = address;
>
>

13. Какие области Beans поддерживает Spring ?

Spring поддерживает пять областей bean

1. Синглтон: ограничивает определение компонента одним экземпляром для каждого контейнера Spring IoC .

2. Прототип: Охватывает один компонент для включения любого количества экземпляров.

3. Запрос: Ограничивает определение компонента одним HTTP -запросом в контексте приложения.

4. Сессия: Область определения компонента для сеанса HTTP в контексте приложения.

5. Глобальная сессия: Расширяет определение компонента до глобального HTTP

14. Каковы этапы жизненного цикла компонента?

Жизненный цикл компонента состоит из семи этапов:

1. Создать экземпляр: Компонент создается контейнером Spring с использованием определения компонента, найденного в файле конфигурации XML .

2. Заполнение свойств: Spring заполняет все определенные свойства из XML -файла с помощью внедрения зависимостей.

3. Установить имя компонента: Spring передает идентификатор компонента методу setBeanName () , если компонент использует интерфейс BeanNameAware .

4. Установить baen factory : Spring передает beanfactory методу setBeanFactory () , если компонент настроен на использование интерфейса BeanFactoryAware .

5. Предварительная инициализация: Spring вызывает любые BeanPostProcessors , связанные с компонентом, с помощью метода postProcessorBeforeInitialization () .

6. Инициализация: Затем инициализируется компонент. Выполняется любой специальный процесс инициализации, указанный в методе инициализации.

7. Постинициализация: Вызываются все определенные методы postProcessAfterInitialization () . Теперь bean завершен. Компоненты, реализующие DisposableBean , будут удалены с помощью функции destroy() после завершения их работы.

15. Объясните внутреннюю часть bean в Spring

Внутренний компонент используется как свойство другого компонента. Внутренние компоненты могут быть определены в XML-файле конфигурации либо в элементах , либо Все внутренние компоненты всегда имеют область действия как prototype и не имеют идентификаторов.

16. Что такое автоматическая проводка bean?

Это функция Spring, которая позволяет контейнеру Spring автоматически устанавливать отношения зависимостей между сотрудничающими компонентами, просматривая BeanFactory. Автоматическая проводка может быть настроена для определения этих отношений с использованием имен компонентов, типов или даже конструкторов классов.

17. Как вы можете внедрить коллекции Java в Spring ?

Коллекции Java могут быть введены четырьмя различными способами:

: Помогает вам передавать наборы значений, такие как списки, разрешая при этом дубликаты.

: Помогает связать набор значений, избегая при этом дублирования.

: Позволяет вводить коллекцию пар ключ-значение любого типа данных.

: Позволяет вводить коллекцию пар ключ-значение как с ключами, так и со значениями типа String.

18. Что такое Joinpoint ?

Joinpoint представляют собой любую точку в программе, в которой выполняется действие. Примеры Joinpoint включают в себя обработку исключения или выполнение метода. При использовании AOП только выполнение метода является точками соединения.

19. Что такое Advice в Spring ?

Advice – это действие, предпринятое в данной точке соединения. AOП использует Advice в качестве перехватчика до завершения выполнения метода.

20. Каковы типы рекомендаций для структуры Spring?

До: Это советы, которые выполняются до методов joinpoint . Они помечены знаком @before .

После возврата: они выполняются после того, как метод joinpoint завершит выполнение без проблем. Они помечены знаком аннотации @AfterReturning .

После выполнения: Они выполняются только в том случае, если метод joinnpoint заканчивается созданием исключения. Они помечены с помощью метки аннотации @AfterThrowing .

После: Они выполняются после метода joinpoint , независимо от того, как он завершается. Они помечены знаком @After .

Вокруг: Они выполняются до и после точки соединения и помечаются с помощью метки @Around аннотации.

21. Что такое Weaving ?

Weaving Spring – это процесс связывания элементов с другими типами приложений или объектами для создания рекомендуемых объектов.

22. Опишите поддержку Spring DAO

Поддержка объектов доступа к данным (DAO) - это набор инструментов, которые упрощают работу с технологиями доступа к данным, такими как Hibernate и JDO, с улучшенной согласованностью. Он также автоматически улавливает технологические ошибки. Вместе они облегчают работу с DAOS и позволяют без ошибок переключаться между технологиями сохранения.

23. Что такое JDBC? Какие классы присутствуют в API Spring JDBC?

JDBC означает подключение к базе данных Java. Это интерфейс прикладного программирования на Java, используемый для определения способа доступа программы к базе данных. API JDBC содержит:

24. Что такое платформа Spring Model - View - Controller ( MVC )?

Платформа Spring MVC предоставляет архитектуру контроллера представления модели и готовые компоненты, используемые для разработки слабо связанных веб-приложений. Используя MVC, вы можете разделить различные аспекты программы, такие как бизнес, логика ввода и пользовательский интерфейс, сохраняя при этом слабую связь между ними. Это обеспечивает большую гибкость в ваших веб-приложениях.

25. Каковы части фреймворка Spring MVC?

Тремя основными частями MVC являются:

DispatcherServlet: Эта часть MVC управляет всеми HTTP-запросами и ответами, которые взаимодействуют с программой. DispatcherServlet сначала получает соответствующее сопоставление обработчика из файла конфигурации, а затем передает запрос контроллеру. DispatcherServlet является наиболее важной частью платформы Spring Web MVC.

WebApplicationContext: Это действует как расширение обычного ApplicationContext с дополнительными функциями, необходимыми для веб-приложений. Он может однозначно разрешать темы и автоматически определять, с каким сервлетом он связан.

Контроллеры: Это компоненты в DispatcherServlet, которые действуют как фильтры между вводом данных пользователем и ответом приложения. Контроллеры принимают ввод пользователя, решают, следует ли преобразовать его в Представление или Модель, и, наконец, возвращают преобразованный ввод в Распознаватель представлений для просмотра.

26. Каковы различные части DispatcherServlet?

Сопоставление обработчика: интерфейс, определяющий сопоставление между обработчиком и объектами запроса. Может использоваться для создания пользовательской стратегии сопоставления.

Контроллер: Определяет реакцию приложения на ввод данных пользователем путем сортировки запросов на ввод по желаемому результату. Входные данные либо немедленно возвращаются с представлением, либо преобразуются в Модель перед передачей в распознаватель представлений.

Распознаватель представлений: Принимает и отображает модели с контроллера путем сопоставления имен представлений и фактических представлений.

27. Как можно включить проводку аннотаций в Spring ?

Чтобы разрешить подключение аннотаций, включите в свой файл конфигурации XML :

< beans
//.
xmlns : context =" http :// www . springframework . org / schema / context "
//.
http :// www . springframework . org / schema / context
http :// www . springframework . org / schema / context / spring - context -2.5. xsd ">
//.

28. Что такое Spring Boot ?

Spring Boot – это Java -фреймворк с открытым исходным кодом, используемый для создания микросервисов. Это проект, построенный на основе Spring , чтобы упростить задачу развертывания приложений Java . Его двумя основными компонентами являются Spring Framework и встроенные HTTP -серверы.

Spring Boot используется для:

• Упрощение процесса разработки готовых к производству пружинных приложений

• Избегания конфигурации XML Spring

• Сокращения времени разработки за счет уменьшения количества необходимых инструкций по импорту

• Обеспечения взвешенного подхода к развитию

Часто используются для быстрого запуска приложений Spring .

29. Что такое Реактивное программирование?

Реактивное программирование – это парадигма программирования, которая основывается на запрограммированных действиях, запускаемых в связи с событиями, а не на хронологическом порядке кода. Реактивные программы эффективно используют компьютерные ресурсы и хорошо масштабируются всего несколькими потоками. Его непоследовательная форма позволяет избежать блокировки стека и поддерживать оперативность реагирования.

30. Что такое Spring webflux ?

Webflux – это реактивный веб-фреймворк, который служит альтернативой MVC. Webflux обеспечивает лучшую масштабируемость и предотвращает блокировку стека.

31. В чем разница между веб-клиентом и клиентом веб-тестирования?

WebClient – это компонент платформы Web Reactive, который упрощает создание реактивных и неблокирующих веб-приложений.

Webtestclient является версией этого клиента со всеми теми же функциями, но отключен от реальных сред. Тестовому клиенту для работы не требуется живая среда HTTP-сервера, что делает его хорошей средой тестирования для новых приложений. Он может подключаться к любому серверу по HTTP-соединению или напрямую синхронизироваться с WebFlux для применения фиктивных HTTP-запросов и создания объектов ответа.

32. Может ли Spring Boot разрешить Spring MVC или Spring Web Flux в одном и том же приложении?

Загрузка позволяет использовать и то, и другое в одном приложении, но может применяться только по одному за раз. Web Flux-это неблокирующая структура, в то время как MVC-это блокирующая структура, что делает их несовместимыми друг с другом.

33. Может ли Spring 5 интегрироваться с модульностью Jdk9?

Да, Spring 5 может интегрироваться с Jdk9. Вот как вы можете это сделать:

Создайте новый класс

package com.hello;
public class HelloWorld <
public String sayHello() <
return "HelloWorld";
>
>

Создайте новый модуль

module com.hello <
export com.hello;
>

Создайте новый Java проект

module com.hello.client <
requires com.hello;
>

Протестируйте новый модуль

public class HelloWorldClient <
public static void main(String[] args) <
HelloWorld helloWorld = new HelloWorld();
log.info(helloWorld.sayHello());
>
>

Не уверены, что знаете ответы на все вопросы?

СИБИНОЦЕНТР проводит курсы Java программистов. Наши курсы подойдут как начинающим специалистам с минимальным опытом программирования, так и опытным разработчикам. Обучение можно пройти как в очном формате (в классе СИБИНФОЦЕНТР, так и в дистанционном (в режиме реального времени, не запись). Курсы проводят опытные преподаватели-практики.

Выбрать курс и записаться на обучение, получить подробную программу курса, задать уточняющие вопросы преподавателю можно по почте info@sibinfo.ru или по бесплатному телефону 8(800)550-63-02 .

Курсы Java

Код

Курсы обучения

Академ. часы

Цена

JSE8J

Java SE8 for junior Developers

40

от 20 000 руб.

JSE8NF

Java SE 8: Новые возможности

16

от 16 000 руб.

JSE8F

Java SE 8: Основы

40

от 15 000 руб.

JSE8P

Java SE 8: Программирование

40

от 15 000 руб.

JSE7F

Java SE 7 Основы

40

от 15 000 руб.

JSE7P

Java SE 7: Программирование

40

от 15 000 руб.

JaT1

Программирование на Java для тестировщиков. Уровень 1

40

от 25 000 руб.

SpD

Spring Data

16

от 30 000 руб.

SpFr

Введение в Spring Framework 4 и Spring Boot 1.5

16

от 30 000 руб.

JVA-010

Владение каркасом разработки Spring Framework

24

от 25 000 руб.

SPRING FRAMEWORK¶

Dependency injection (DI) - паттерн проектирования и архитектурная модель, так же известная как Inversion of Control (IoC). DI описывает ситуацию, когда один объект реализует свой функционал через другой объект. Например, соединение с базой данных передается конструктору объекта через аргумент, вместо того чтобы конструктор сам устанавливал соединение. Существуют три формы внедрения (но не типа) зависимостей: сэттер, конструктор и внедрение путем интерфейса. DI - это способ достижения слабой связанности. IoC предоставляет возможность объекту получать ссылки на свои зависимости. Обычно это реализуется через lookupметод. Преимущество IoC в том, что эта модель позволяет отделить объекты от реализации механизмов, которые он использует. В результате мы получаем большую гибкость как при разработке приложений, так и при их тестировании.

Какие преимущества применения Dependency Injection (DI)?¶

К преимуществам DI можно отнести:

  • Сокращение объема связующего кода. Одним из самых больших плюсов DI является возможность значительного сокращения объема кода, который должен быть написан для связывания вместе различных компонентов приложения. Зачастую этот код очень прост - при создании зависимости должен создаваться новый экземпляр соответствующего объекта.
  • Упрощенная конфигурация приложения. За счет применения DI процесс конфигурирования приложения значительно упрощается. Для конфигурирования классов, которые могут быть внедрены в другие классы, можно использовать аннотации или XML-файлы.
  • Возможность управления общими зависимостями в единственном репозитории. При традиционном подходе к управлению зависимостями в общих службах, к которым относятся, например, подключение к источнику данных, транзакция, удаленные службы и т.п., вы создаете экземпляры (или получаете их из определенных фабричных классов) зависимостей там, где они нужны - внутри зависимого класса. Это приводит к распространению зависимостей по множеству классов в приложении, что может затруднить их изменение. В случае использования DI вся информация об общих зависимостях содержится в единственном репозитории (в Spring есть возможность хранить эту информацию в XML-файлах или Java классах).
  • Улучшенная возможность тестирования. Когда классы проектируются для DI, становится возможной простая замена зависимостей. Это особенно полезно при тестировании приложения.
  • Стимулирование качественных проектных решений для приложений. Вообще говоря, проектирование для DI означает проектирование с использованием интерфейсов. Используя Spring, вы получаете в свое распоряжение целый ряд средств DI и можете сосредоточиться на построении логики приложения, а не на поддерживающей DI платформе.

Какие IoC контейнеры вы знаете?¶

Spring является IoC контейнером. Помимо него существуют HiveMind, Avalon, PicoContainer и т.д.

Как реализуется DI в Spring Framework?¶

Реализация DI в Spring основана на двух ключевых концепциях Java - компонентах JavaBean и интерфейсах. При использовании Spring в качестве поставщика DI вы получаете гибкость определения конфигурации зависимостей внутри своих
приложений разнообразными путями (т.е. внешне в XML-файлах, с помощью конфигурационных Java классов Spring или посредством аннотаций Java в коде). Компоненты JavaBean (также называемые POJO (Plain Old Java Object — простой старый объект Java)) предоставляют стандартный механизм для создания ресурсов Java, которые являются конфигурируемыми множеством способов. За счет применения DI объем кода, который необходим при проектировании приложения на основе интерфейсов, снижается почти до нуля. Кроме того, с помощью интерфейсов можно получить максимальную отдачу от DI, потому что бины могут использовать любую реализацию интерфейса для удовлетворения их зависимости.

Какие существуют виды DI? Приведите примеры.¶

Существует два типа DI: через сэттер и через конструктор.

Через сэттер. Обычно во всех java beans используются гэттеры и сэттеры для их свойств:

Мы создаем экземпляр бина NameBean (например, bean1) и устанавливаем нужное свойство, например:

bean1.setName("Marfa");

Используя Spring реализация была бы такой:

Это и называет DI через сэттер. Пример внедрения зависимости между объектами:

Через конструктор: используется конструктор с параметрами. Например:

Теперь мы внедряем объект на этапе создания экземпляра класса, т.е.

bean1 = new NameBean("Marfs");

Используя Spring это выглядело бы так:

Что такое Spring? Из каких частей состоит Spring Framework?¶

Spring - фреймворк с открытым исходным кодом, предназначеный для упрощения разработки enterprise-приложений. Одним из главным преимуществом Spring является его слоистая архитектура, позволяющая вам самим определять какие компоненты будут использованы в вашем приложении. Модули Spring построены на базе основного контейнера, который определяет создание, конфигурация и менеджмент бинов.

  • Основной контейнер - предоставляет основной функционал Spring. Главным компонентом контейнера является BeanFactory - реализация паттерна Фабрика. BeanFactory позволяет разделить конфигурацию приложения и информацию о зависимостях от кода.
  • Spring context - конфигурационный файл, который предоставляет информация об окружающей среде для Spring. Сюда входят такие enterprise-сервисы, как JNDI, EJB, интернационализация, валиадция и т.п. Spring AOP - отвечает за интеграцию аспектно-ориентированного программирования во фреймворк. Spring AOP обеспечивает сервис управления транзакциями для Spring-приложения.
  • Spring DAO - абстрактный уровень Spring JDBC DAO предоставляет иерархию исключений и множество сообщений об ошибках для разных БД. Эта иерархия упрощает обработку исключений и значительно уменьшает количество кода, которое вам нужно было бы написать для таких операций, как, например, открытие и закрытие соединения.
  • Spring ORM - отвечает за интеграцию Spring и таких популярных ORMфреймворков, как Hibernate, iBatis и JDO.
  • Spring Web module - классы, которые помогают упростить разработку Web (авторизация, доступ к бинам Spring-а из web).
  • Spring MVC framework - реализация паттерна MVC для построения Webприложений.

Назовите некоторые из шаблонов проектирования, используемых в Spring Framework?¶

Spring Framework использует множество шаблонов проектирования, например:

  • Singleton Pattern: Creating beans with default scope.
  • Factory Pattern: Bean Factory classes
  • Prototype Pattern: Bean scopes
  • Adapter Pattern: Spring Web and Spring MVC
  • Proxy Pattern: Spring Aspect Oriented Programming support
  • Template Method Pattern: JdbcTemplate, HibernateTemplate etc
  • Front Controller: Spring MVC DispatcherServlet
  • Data Access Object: Spring DAO support
  • Dependency Injection and Aspect Oriented Programming

Каковы некоторые из важных особенностей и преимуществ Spring Framework?¶

Spring Framework обеспечивает решения многих задач, с которыми сталкиваются Java-разработчики и организации, которые хотят создать информационную систему, основанную на платформе Java. Из-за широкой функциональности трудно определить наиболее значимые структурные элементы, из которых он состоит. Spring Framework не всецело связан с платформой Java Enterprise, несмотря на его масштабную интеграцию с ней, что является важной причиной его популярности.

  • Относительная легкость в изучении и применении фреймворка в разработке и поддержке приложения.
  • Внедрение зависимостей (DI) и инверсия управления (IoC) позволяют писать независимые друг от друга компоненты, что дает преимущества в команднойразработке, переносимости модулей и т.д.
  • Spring IoC контейнер управляет жизненным циклом Spring Bean и настраивается наподобие JNDI lookup (поиска).
  • Проект Spring содержит в себе множество подпроектов, которые затрагивают важные части создания софта, такие как вебсервисы, веб программирование, работа с базами данных, загрузка файлов, обработка ошибок и многое другое. Всё это настраивается в едином формате и упрощает поддержку приложения.

Каковы преимущества использования Spring Tool Suite?¶

Для упрощения процесса разработки основанных на Spring приложений в Eclipse (наиболее часто используемая IDE-среда для разработки Java-приложений), в рамках Spring создан проект Spring IDE. Проект бесплатный. Он интегрирован в Eclipse IDE, Spring IDE, Mylyn (среда разработки в Eclipse, основанная на задачах), Maven for Eclipse, AspectJ Development Tool.

Что такое AOP? Как это относиться к IoC?¶

Аспектно-ориентированное программирование (АОП) - парадигма программирования, основанная на идее разделения функциональности для улучшения разбиения программы на модули. AOP и Spring - взаимодополняющие технологии,которые позволяют решать сложные проблемы путем разделения функционала на отдельные модули. АОП предоставляет возможность реализации сквозной логики - т.е. логики, которая применяется к множеству частей приложения - в одном месте и обеспечения автоматического применения этой логики по всему приложению. Подход Spring к АОП заключается в создании "динамических прокси" для целевых объектов и "привязывании" объектов к конфигурированному совету для выполнения сквозной логики.

Что такое Aspect, Advice, Pointcut, JointPoint и Advice Arguments в АОП?¶

Основные понятия АОП:

  • Аспект (англ. aspect) - модуль или класс, реализующий сквозную функциональность. Аспект изменяет поведение остального кода, применяя совет в точках соединения, определённых некоторым срезом.
  • Совет (англ. advice) - фрагмент кода, который должен выполняться в отдельной точке соединения. Существует несколько типов советов, совет может быть выполнен до, после или вместо точки соединения.
  • Точка соединения (англ. joinpoint) - это четко определенная точка в выполняемой программе, где следует применить совет. Типовые примеры точек соединения включают обращение к методу, собственно Method Invocation, инициализацию класса и создание экземпляра объекта. Многие реализации АОП позволяют использовать вызовы методов и обращения к полям объекта в качестве точек соединения.
  • Срез (англ. pointcut) - набор точек соединения. Срез определяет, подходит ли данная точка соединения к данному совету. Самые удобные реализации АОП используют для определения срезов синтаксис основного языка (например, в AspectJ применяются Java-сигнатуры) и позволяют их повторное использование с помощью переименования и комбинирования.
  • Связывание(англ. weaving) представляет собой процесс действительной вставки аспектов в определенную точку кода приложения. Для решений АОП времени компиляции это делается на этапе компиляции, обычно в виде дополнительного шага процесса сборки. Аналогично, для решений АОП времени выполнения связывание происходит динамически во время выполнения. В AspectJ поддерживается еще один механизм связывания под названием связывание во время загрузки (load-time weaving - LTW), который перехватывает лежащий в основе загрузчик классов JVM и обеспечивает связывание с байт-кодом, когда он загружается загрузчиком классов.
  • Цель(англ. target) - это объект, поток выполнения которого изменяется каким-то процессом АОП. На целевой объект часто ссылаются как на объект, снабженный советом.
  • Внедрение (англ. introduction, введение) - представляет собой процесс, посредством которого можно изменить структуру объекта за счет введения в него дополнительных методов или полей, изменение иерархии наследования для добавления функциональности аспекта в инородный код. Обычно реализуется с помощью некоторого метаобъектного протокола (англ. metaobject protocol, MOP).

В чем разница между Spring AOP и AspectJ АОП?¶

AspectJ де-факто является стандартом реализации АОП. Реализация АОП от Spring имеет некоторые отличия:

  • Spring AOP немного проще, т.к. нет необходимости следить за процессом связывания.
  • Spring AOP поддерживает аннотации AspectJ, таким образом мы можем работать в спринг проекте похожим образом с AspectJ проектом.
  • Spring AOP поддерживает только proxy-based АОП и может использовать только один тип точек соединения - Method Invocation. AspectJ поддерживает все виды точек соединения.
  • Недостатком Spring AOP является работа только со своими бинами, которые существуют в Spring Context.

Что такое IoC контейнер Spring?¶

По своей сути IoC, а, следовательно, и DI, направлены на то, чтобы предложить простой механизм для предоставления зависимостей компонента (часто называемых коллабораторами объекта) и управления этими зависимостями на протяжении всего их жизненного цикла. Компонент, который требует определенных зависимостей, зачастую называют зависимым объектом или, в случае IoC, целевым объектом. IoC предоставляет службы, через которые компоненты могут получать доступ к своим зависимостям, и службы для взаимодействия с зависимостями в течение их времени жизни. В общем случае IoC может быть расщеплена на два подтипа: инверсия управления (Dependency Injection) и инверсия поиска (Dependency Lookup). Инверсия управления — это крупная часть того, делает Spring, и ядро реализации Spring основано на инверсии управления, хотя также предоставляются и средства Dependency Lookup. Когда платформа Spring предоставляет коллабораторы зависимому объекту автоматически, она делает это с использованием инверсии управления (Dependency Injection). В приложении, основанном на Spring, всегда предпочтительнее применять Dependency Injection для передачи коллабораторов зависимым объектам вместо того, чтобы заставлять зависимые объекты получать коллабораторы через поиск.

Что такое Spring бин?¶

Термин бин (англ. Bean) - в Spring используется для ссылки на любой компонент, управляемый контейнером. Обычно бины на определенном уровне придерживаются спецификации JavaBean, но это не обязательно особенно если для связывания бинов друг с другом планируется применять Constructor Injection. Для получения экземпляра бина используется ApplicationContext. IoC контейнер управляет жизненным циклом спринг бина, областью видимости и внедрением.

Какое значение имеет конфигурационный файл Spring Bean?¶

Конфигурационный файл спринг определяет все бины, которые будут инициализированы в Spring Context. При создании экземпляра Spring ApplicationContext будет прочитан конфигурационный xml файл и выполнены указанные в нем необходимые инициализации. Отдельно от базовой конфигурации, в файле могут содержаться описание перехватчиков (interceptors), view resolvers, настройки локализации и др.

Каковы различные способы настроить класс как Spring Bean?¶

Существует несколько способов работы с классами в Spring.

Java based конфигурация. Все настройки и указания бинов прописываются в java коде:

Для извлечения бина из контекста используется следующий подход:

Annotation based конфигурация. Можно использовать внутри кода аннотации @Component, @Service, @Repository, @Controller для указания классов в качестве спринг бинов. Для их поиска и управления контейнером прописывается настройка в xml файле:

Какие вы знаете scope у Spring Bean?¶

В Spring предусмотрены различные области времени действия бинов:

  • singleton - может быть создан только один экземпляр бина. Этот тип используется спрингом по умолчанию, если не указано другое. Следует осторожно использовать публичные свойства класса, т.к. они не будут потокобезопасными.
  • prototype - создается новый экземпляр при каждом запросе.
  • request - аналогичен prototype, но название служит пояснением к использованию бина в веб приложении. Создается новый экземпляр при каждом HTTP request.
  • session - новый бин создается в контейнере при каждой новой HTTP сессии.
  • global-session: используется для создания глобальных бинов на уровне сессии для Portlet приложений.

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

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

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

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

BeanFactory factory = new XmlBeanFactory(new FileInputStream("myBean.xml")); 

После этой строки фабрика знает о бинах, но их экземпляры еще не созданы. Чтобы инстанцировать бин нужно вызвать метод getBean(). Например:

myBean bean1 = (myBean) factory.getBean("myBean"); 

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

Доступны два способа для получения основных объектов контейнера внутри бина:

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

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

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

  • возможность получения текстовых сообщений, в том числе поддержку интернационализации;
  • общий механизм работы с ресурсами;
  • события для бинов, которые зарегестрированы как слушатели.

Из-за большей функциональности рекомендуется использование Application Context вместо BeanFactory. Последний используется только в случаях нехватки ресурсов, например при разработке для мобильных устройств.

Как выглядит типичная реализция метода используя 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 бин потокобезопасным?¶

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

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

В независимой Java программе ApplicationContext можно создать следующим образом: AnnotationConfigApplicationContext - при использовании Spring в качестве автономного приложения можно создать инициализировать контейнер с помощью аннотаций. Пример:

ApplicationContext context = new AnnotationConfigApplicationContext("bean.xml"); 

ClassPathXmlApplicationContext - получает информацию из xml-файла, находящегося в classpath. Пример:

ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml"); 

FileSystemXmlApplicationContext - получает информацию из xml-файла, но с возможностью загрузки файла конфигурации из любого места файловой системы. Пример:

ApplicationContext context = new FileSystemXmlApplicationContext("bean.xml"); 

XmlWebApplicationContext - получает информацию из xml-файла за пределами webприложения.

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

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

Поддерживается возможность указания нескольких корневых файлов конфигурации Spring:

Файл конфигурации можно импортировать:

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

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

Или через аннотации:

@Value("$") private int maxReadResults; 

Как настраивается соединение с БД в 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-приложение стартует. По-умолчанию оно загружает файл WEBINF/applicationContext.xml. Вы можете изменить значение по-умолчанию, указав параметр contextConfigLocation. Пример:

Что такое контроллер в Spring MVC?¶

Ключевым интерфейсом в Spring MVC является Controller. Контроллер обрабатывает запросы к действиям, осуществляемые пользователями в пользовательском интерфейсе, взаимодействуя с уровнем обслуживания, обновляя модель и направляя пользователей на соответствующие представления в зависимости от результатов выполнения. Controller - управление, связь между моделью и видом.

Основным контроллером в Spring MVC является org.springframework.web.servlet.DispatcherServlet. Задается аннотацией @Controller и часто используется с аннотацией @RequestMapping, которая указывает какие запросы будут обрабатываться этим контроллером.

Какая разница между аннотациями @Component, @Repository и @Service в Spring?¶

  • @Component - используется для указания класса в качестве компонента spring. При использовании поиска аннотаций, такой класс будет сконфигурирован как spring bean.
  • @Controller - специальный тип класса, применяемый в MVC приложениях. Обрабатывает запросы и часто используется с аннотацией @RequestMapping.
  • @Repository - указывает, что класс используется для работы с поиском, получением и хранением данных. Аннотация может использоваться для реализации шаблона DAO.
  • @Service - указывает, что класс является сервисом для реализации бизнес логики (на самом деле не отличается от Component, но просто помогает разработчику указать смысловую нагрузку класса).

Для указания контейнеру на класс-бин можно использовать любую из этих аннотаций. Но различные имена позволяют различать назначение того или иного класса.

Расскажите, что вы знаете о DispatcherServlet и ContextLoaderListener.¶

DispatcherServlet - сервлет диспатчер. Этот сервлет анализирует запросы и направляет их соответствующему контроллеру для обработки. В Spring MVC класс DispatcherServlet является центральным сервлетом, который получает запросы и направляет их соответствующим контроллерам. В приложении Spring MVC может существовать произвольное количество экземпляров DispatcherServlet, предназначенных для разных целей (например, для обработки запросов пользовательского интерфейса, запросов веб-служб REST и т.д.). Каждый экземпляр DispatcherServlet имеет собственную конфигурацию WebApplicationContext, которая сервлет, отображение обработчиков, распознавание представлений, интернационализация, оформление темами, проверка достоверности, преобразование типов и форматирование и т.п.

ContextLoaderListener - слушатель при старте и завершении корневого класса Spring WebApplicationContext. Основным назначением является связывание жизненного цикла ApplicationContext и ServletContext, а так же автоматического создания ApplicationContext. Можно использовать этот класс для доступа к бинам из различных контекстов спринг. Настраивается в web.xml:

Что такое ViewResolver в Spring?¶

ViewResolver - распознаватель представлений. Интерфейс ViewResolver в Spring MVC (из пакета org.springframework.web.servlet) поддерживает распознавание представлений на основе логического имени, возвращаемого контроллером. Для
поддержки различных механизмов распознавания представлений предусмотрено множество классов реализации. Например, класс UrlBasedViewResolver поддерживает прямое преобразование логических имен в URL. Класс ContentNegotiatingViewResolver поддерживает динамическое распознавание представлений в зависимости от типа медиа, поддерживаемого клиентом (XML, PDF, JSON и т.д.). Существует также несколько реализаций для интеграции с различными технологиями представлений, такими как FreeMarker (FreeMarkerViewResolver), Velocity (VelocityViewResolver) и JasperReports (JasperReportsViewResolver).

InternalResourceViewResolver - реализация ViewResolver, которая позволяет находить представления, которые возвращает контроллер для последующего перехода к нему. Ищет по заданному пути, префиксу, суффиксу и имени.

Что такое MultipartResolver и когда его использовать?¶

Интерфейс MultipartResolver используется для загрузки файлов. Существуют две реализации: CommonsMultipartResolver и StandardServletMultipartResolver, которые позволяют фреймворку загружать файлы. По умолчанию этот интерфейс не включается в приложении и необходимо указывать его в файле конфигурации. После настройки любой запрос о загрузке будет отправляться этому интерфейсу.

Как загрузить файл в Spring MVC?¶

Внутри спринг предусмотрен интерфейс MultipartResolver для обеспечения загрузки файлов. Фактически нужно настроить файл конфигурации для указания обработчика загрузки файлов, а затем задать необходимый метод в контроллере spring.

Как обрабатывать исключения в Spring MVC Framework?¶

В Spring MVC интерфейс HandlerExceptionResolver (из пакета org.springframework.web.servlet) предназначен для работы с непредвиденными исключениями, возникающими во время выполнения обработчиков. По умолчанию DispatcherServlet регистрирует класс DefaultHandlerExceptionResolver (из пакета org.springframework.web.servlet.mvc.support). Этот распознаватель обрабатывает определенные стандартные исключения Spring MVC, устанавливая специальный код состояния ответа. Можно также реализовать собственный обработчик исключений, аннотировав метод контроллера с помощью аннотации @ExceptionHandler и передав ей в качестве атрибута тип исключения. В общем случае обработку исключений можно
описать таким образом:

Controller Based - указать методы для обработки исключения в классе контроллере. Для этого нужно пометить такие методы аннотацией @ExceptionHandler.
Global Exception Handler - для обработки глобальных исключений spring предоставляет аннотацию @ControllerAdvice.
HandlerExceptionResolver implementation – общие исключений большая часть времени обслуживают статические страницы. Spring Framework предоставляет интерфейс HandlerExceptionResolver, который позволяет задать глобального обработчика исключений. Реализацию этого интерфейса можно использовать для создания собственных глобальных обработчиков исключений в приложении

Каковы минимальные настройки, чтобы создать приложение Spring MVC?¶

Для создания простого Spring MVC приложения необходимо пройти следующие шаги:

  • Добавить зависимости spring-context и spring-webmvc в проект.
  • Указать DispatcherServlet в web.xml для обработки запросов внутри приложения.
  • Задать определение spring bean (аннотацией или в xml).
  • Добавить определение view resolver для представлений.
  • Настроить класс контроллер для обработки клиентских запросов.

Как бы вы связали Spring MVC Framework и архитектуру MVC?¶

Модель (Model) - выступает любой Java bean в Spring. Внутри класса могут быть заданы различные атрибуты и свойства для использования в представлении. Преставление (View) - JSP страница, HTML файл и т.п. служат для отображения необходимой информации пользователю. Представление передает обработку запросов к диспетчеру сервлетов (контроллеру). DispatcherServlet (Controller) - это главный контроллер в приложении Spring MVC, который обрабатывает все входящие запросы и передает их для обработки в различные методы в контроллеры.

Как добиться локализации в приложениях Spring MVC?¶

Spring MVC предоставляет очень простую и удобную возможность локализации приложения. Для этого необходимо сделать следующее:

  • Создать файл resource bundle, в котором будут заданы различные варианты локализированной информации.
  • Определить messageSource в конфигурации Spring используя классы ResourceBundleMessageSource или ResourceBundleMessageSource.
  • Определить localceResolver класса CookieLocaleResolver для включения возможности переключения локали.
  • С помощью элемента spring:message DispatcherServlet будет определять в каком месте необходимо подставлять локализированное сообщение в ответе.

Как мы можем использовать Spring для создания веб-службы RESTful, возвращающей JSON?¶

Spring Framework позволяет создавать Resful веб сервисы и возвращать данные в формате JSON. Spring обеспечивает интеграцию с Jackson JSON API для возможности отправки JSON ответов в resful web сервисе. Для отправки ответа в формате JSON из Spring MVC приложения необходимо произвести следующие настройки.

Добавить зависимости Jackson JSON. С помощью maven это делается так:

Настроить бин RequestMappingHandlerAdapter в файле конфигурации Spring и задать свойство messageConverters на использование бина

В контроллере указать с помощью аннотации @ResponseBody возвращение Object:

Как проверить (валидировать) данные формы в Spring Web MVC Framework?¶

Spring поддерживает аннотации валидации из JSR-303, а так же возможность создания своих реализаций классов валидаторов. Пример использования аннотаций:

Что вы знаете Spring MVC Interceptor и как он используется?¶

Перехватчики в Spring (Spring Interceptor) являются аналогом Servlet Filter и позволяют перехватывать запросы клиента и обрабатывать их. Перехватить запрос клиента можно в трех местах: preHandle, postHandle и afterCompletion.

  • preHandle - метод используется для обработки запросов, которые еще не были переданы в метода обработчик контроллера. Должен вернуть true для передачи следующему перехватчику или в handler method. False укажет на обработку запроса самим обработчиком и отсутствию необходимости передавать его дальше. Метод имеет возможность выкидывать исключения и пересылать ошибки к представлению.
  • postHandle - вызывается после handler method, но до обработки DispatcherServlet для передачи представлению. Может использоваться для добавления параметров в объект ModelAndView.
  • afterCompletion - вызывается после отрисовки представления.

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

Расскажите о Spring Security.¶

Проект Spring Security предоставляет широкие возможности для защиты приложения. Кроме стандартных настроек для аутентификации, авторизации и распределения ролей и маппинга доступных страниц, ссылок и т.п., предоставляет защиту от различных вариантов атак (например CSRF). Имеет множество различных настроек, но остается легким в использовании.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *