На самом деле нет ничего особенного в написании веб-приложения Spring-boot исключительно с использованием Scala, оно просто работает!
В этой записи блога я постепенно преобразую приложение Spring-boot на основе Java полностью в Scala — образец на основе Java доступен по адресу github — https://github.com/bijukunjummen/spring-boot-mvc-test
Начнем с того, что у меня была возможность выбрать сборку на основе maven или сборку на основе gradle — я решил использовать сборку на основе gradle, так как gradle имеет отличный плагин для scala, поэтому для поддержки scala единственные изменения в build.gradle Сценарий сборки выглядит следующим образом:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
...apply plugin: 'scala'...jar { baseName = 'spring-boot-scala-web' version = '0.1.0'}dependencies { ... compile 'org.scala-lang:scala-library:2.10.2' ...} |
По сути, добавление в плагин Scala и указание версии библиотеки Scala.
Теперь у меня есть одна сущность, класс Hotel, она преобразуется в Scala следующим образом:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
package mvctest.domain....@Entityclass Hotel { @Id @GeneratedValue @BeanProperty var id: Long = _ @BeanProperty var name: String = _ @BeanProperty var address: String = _ @BeanProperty var zip: String = _} |
Каждое свойство помечено аннотацией @BeanProperty, чтобы дать команду scala генерировать переменные на основе bean-компонента Java для переменных.
При наличии сущности репозиторий Spring-data для операций CRUD над этой сущностью преобразуется из:
|
1
2
3
4
5
6
7
|
import mvctest.domain.Hotel;import org.springframework.data.repository.CrudRepository;public interface HotelRepository extends CrudRepository<Hotel, Long> {} |
в Scala следующее:
|
1
2
3
4
5
|
import org.springframework.data.repository.CrudRepositoryimport mvctest.domain.Hotelimport java.lang.Longtrait HotelRepository extends CrudRepository[Hotel, Long] |
И контроллер на основе Scala, который использует этот репозиторий для перечисления отелей —
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
...import org.springframework.web.bind.annotation.RequestMappingimport org.springframework.stereotype.Controllerimport mvctest.service.HotelRepositoryimport org.springframework.beans.factory.annotation.Autowiredimport org.springframework.ui.Model@Controller@RequestMapping(Array("/hotels"))class HotelController @Autowired() (private val hotelRepository: HotelRepository) { @RequestMapping(Array("/list")) def list(model: Model) = { val hotels = hotelRepository.findAll() model.addAttribute("hotels", hotels) "hotels/list" }} |
Здесь просто работает конструктор автопроводки от HotelRepository !. Обратите внимание на немного неуклюжий способ указания аннотации @Autowired для внедрения на основе конструктора.
Наконец, приложению на основе Spring-boot требуется главный класс для начальной загрузки всего приложения, где этот класс начальной загрузки выглядит следующим образом с Java:
|
1
2
3
4
5
6
7
8
9
|
@Configuration@EnableAutoConfiguration@ComponentScanpublic class SampleWebApplication { public static void main(String[] args) { SpringApplication.run(SampleWebApplication.class, args); }} |
В scala, хотя мне нужно было предоставить два класса, один для указания аннотации, а другой для начальной загрузки приложения, может быть лучший способ сделать это (вините в этом мое отсутствие глубины Scala!) —
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
package mvctestimport org.springframework.context.annotation.Configurationimport org.springframework.boot.autoconfigure.EnableAutoConfigurationimport org.springframework.context.annotation.ComponentScanimport org.springframework.boot.SpringApplication@Configuration@EnableAutoConfiguration@ComponentScanclass SampleConfigobject SampleWebApplication extends App { SpringApplication.run(classOf[SampleConfig]);} |
и все, с этой настройкой все приложение просто работает, приложение может быть запущено с помощью следующего:
|
1
|
./gradlew build && java -jar build/libs/spring-boot-scala-web-0.1.0.jar |
и пример конечной точки со списком отелей, доступных по этому URL: http: // localhost: 8080 / hotels / list
У меня есть весь проект git, доступный по адресу github : https://github.com/bijukunjummen/spring-boot-scala-web
В заключение можно сказать, что Scala можно считать первоклассным гражданином для приложения на основе Spring-boot, и для работы приложения на основе Scala на базе Spring не требуется специальной настройки. Это просто работает!
| Ссылка: | Spring-boot и Scala от нашего партнера JCG Биджу Кунджуммен в блоге « Все и вся» . |