На самом деле нет ничего особенного в написании веб-приложения 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 .... @Entity class 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.CrudRepository import mvctest.domain.Hotel import java.lang.Long trait 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.RequestMapping import org.springframework.stereotype.Controller import mvctest.service.HotelRepository import org.springframework.beans.factory.annotation.Autowired import 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 @ComponentScan public 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 mvctest import org.springframework.context.annotation.Configuration import org.springframework.boot.autoconfigure.EnableAutoConfiguration import org.springframework.context.annotation.ComponentScan import org.springframework.boot.SpringApplication @Configuration @EnableAutoConfiguration @ComponentScan class SampleConfig object 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 Биджу Кунджуммен в блоге « Все и вся» . |